簡體   English   中英

使用/包含來自另一個節點的值

[英]Use/include a value from another node

我有一個XML文件,如下所示:

<area1>
    <settings>
        <setting name="to_include">value</setting>
    </settings>
</area1>
<area2>
    <settings>
        <setting name="where_to_include">?????</setting>
    </settings>
</area2>

我想將設置節點“ to_include”的值作為設置節點“ where_to_include”的值包括在內 我怎么能用純XML方式做到這一點? XInclude? XPointer? XPath? XLink? 其他?

我希望我可以做這樣的事情:

<area2>
    <settings>
        <setting name="where_to_include">
            <xi:include href="SAMEFILE" xpointer="xpointer(/areas/area1/settings/setting[@name='debug'])">
                <xi:fallback>FALLBACK VALUE</xi:fallback>
        </setting>
    </settings>
</area2>

但是使用XInclude時,我無法在解析文檔時引用該文檔本身。

我不太明白這個問題,但是我想我知道您的意思。 這可能不是您要追求的。 您提到了XPointer和XInclude,這對我來說似乎太過分了。

這是XSLT(1.0)解決方案。 樣式表采用一個XML文件(例如您在問題中提供的XML文件),並為?????插入value (順便說一下,(您的XML缺少包裝元素,因此在技術上來說是畸形的。但是我想我理解您的意思。我會默默地將areas添加為文檔元素,這就是下面的樣式表的工作方式。您可能需要對其進行調整以適合您實際使用的XML。)

這是樣式表:

<?xml version='1.0' encoding='UTF-8'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="*">
    <xsl:variable name="n" select="name (.)"/>
    <xsl:element name="{$n}">
      <xsl:for-each select="@*">
        <xsl:copy-of select="."/>
      </xsl:for-each>
      <xsl:apply-templates select="node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:copy-of select="."/>
  </xsl:template>

  <xsl:template match="/">
    <xsl:element name="areas">
      <xsl:apply-templates select="areas"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="areas">
    <xsl:apply-templates select="area1"/>
    <xsl:apply-templates select="area2"/>
  </xsl:template>

  <xsl:template match="text()[parent::setting[ancestor::area2]]">
    <xsl:apply-templates select="preceding::area1/settings/setting/text()"/>
  </xsl:template>
</xsl:stylesheet>

樣式表實際上只是復制輸入的XML文檔,只是在以下一點上area2不同:處理area2下的setting ,它不復制文本,而是返回到area1節點並復制其setting下的文本。 您可以確認使用任何XSLT處理器(例如xsltproc)都可以正常工作(聽起來您可以使用一些非平凡的XML功能,因此應該非常簡單)。 只需對value進行一些更改,然后在更改后的XML文檔上運行樣式表即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM