我不太明白这个问题,但我想我知道你的意思。这可能不是你所追求的。你提到了 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
under时area2
,它不复制文本而是返回到area1
节点并复制其下的文本setting
。您可以使用任何 XSLT 处理器(例如 xsltproc)确认这是否有效(听起来您可以使用一些重要的 XML 功能,所以这应该非常简单)。只需对已更改的 XML 文档进行一些更改value
并运行样式表。