使用/包含另一个节点的值

时间:2014-11-13 12:19:31

标签: xml xpath include xinclude xpointer

我有一个 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 我在解析时无法引用文档本身。

1 个答案:

答案 0 :(得分:0)

我不太明白这个问题,但我想我知道你的意思。这可能不是你所追求的。你提到XPointer和XInclude,这对我来说似乎有点过分了。

这是一个XSLT(1.0)解决方案。样式表采用与您在问题中提供的XML文件类似的XML文件,并为value插入?????。 (顺便说一句,你的XML缺少一个包装元素,所以它在技术上是错误的。但我想我明白你的意思。我会默默地添加areas作为文档元素,并且#39 ; s后面的样式表如何工作。您可能需要调整它以适合您实际使用的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文档,但有一点除外:在处理setting下的area2时,它不会复制文本但会返回{{ 1}}节点并将文本复制到其area1下。你可以确认这可以使用任何XSLT处理器,例如xsltproc(听起来你可以使用一些非平凡的XML功能,所以这应该非常简单)。只需对setting进行一些更改,然后在更改的XML文档上运行样式表。