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

标签 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时,我无法在解析文档时引用该文档本身。

最佳答案

我不太了解这个问题,但我想我知道您的意思。这可能不是您要追求的。您提到了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文档,只是要注意一点:在setting下处理area2时,它不会复制文本,而是返回到area1节点并在其<下复制文本。 cc>。您可以确认使用任何XSLT处理器(例如xsltproc)都可以正常工作(听起来好像您可以使用一些非平凡的XML功能,因此应该非常简单)。只需对setting进行一些更改,然后在更改后的XML文档上运行样式表。

关于xml - 使用/包含来自另一个节点的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26908757/

相关文章:

java - 如何在android中将数据库中的数据显示为复选框列表

python - 在python中解析嵌套的xml

cmake - 有没有办法为 FetchContent 目标获取 -isystem?

ruby - 在Nokogiri中同时访问两个元素

python - 简单的 XPath 表达式在 Python 中不起作用

c - 包含二进制文件作为常量数组

Qt 无法打开包含文件 : 'QPrinter'

xml - 更改自定义 Excel 功能区下拉列表的大小

java - 未生成 R.java 文件。如何解决?

ios - Appium 从元素获取 xpath?