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



我有一个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 方式做到这一点?十一?XPointer?XPath?呵呵?其他?

我希望我能做这样的事情:

<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 文件,类似于您在问题中给出的文件,并插入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下的setting时,它不会复制文本,而是返回到area1节点并在其setting下复制文本。 您可以使用任何 XSLT 处理器(例如 xsltproc)确认这是否有效(听起来您有一些重要的 XML 功能可供您使用,所以这应该非常简单)。 只需对value进行一些更改,然后在更改的 XML 文档上运行样式表。

相关内容

  • 没有找到相关文章

最新更新