如何使用 XSLT 将 XML 文档分解为多个文档并从结果树中排除特定的子节点



我有一个相当大的XML文件,我想把它分解成更小的文件。我可以在大多数情况下使用xsl:result-documentxsl:copy-of来做到这一点。但是,我不想将特定的子节点复制到结果树中。以下是我正在使用的结构的示例:

<root>
<a id="parent_node1">
<!-- stuff I want to copy into the parent_node1 tree -->
<a id="child_node1">
<!-- stuff I want to copy into the child_node1 tree -->
<a id="descendant_node1">
<!-- stuff I want to copy into the descendant_node1 tree -->
</a>
</a>
</a>
<a id="parent_node2">
...
</a>
...
</root>

我想要的结果是将每个<a>节点复制到单独的文档中,同时排除任何<a>子节点。当我做这样的事情时:

<xsl:template match="/">
<xsl:for-each select="a">
<xsl:result-document href="a_{@id}.xml>
<xsl:copy-of select="." copy-namespaces="no"/>
</xsl:result-document>
<xsl:for-each select="a">
...
</xsl:for-each>
</xsl:for-each>
</xsl:template>

我最终在输出中使用了不需要的子节点。所以,我有几个问题。

  • 如何以我想要的方式处理这个大型 XML?
  • 如果我想在处理时更改特定属性的值之类的内容,我需要做什么?

xsl:copy-of指令执行深层复制;你想做一个浅拷贝,例如:

<xsl:template match="/root">
<xsl:for-each select="a">
<xsl:result-document href="a_{@id}.xml">
<xsl:copy>
<xsl:copy-of select="a/a"/>
</xsl:copy>
</xsl:result-document>
</xsl:for-each>
</xsl:template> 

如果我想更改诸如值之类的内容,我需要做什么 处理时的特定属性?

使用xsl:apply-templates而不是xsl:copy-of并具有匹配的模板来执行更改 - 例如:

<xsl:template match="/root">
<xsl:for-each select="a">
<xsl:result-document href="a_{@id}.xml">
<xsl:copy>
<xsl:apply-templates select="a/a"/>
</xsl:copy>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
<xsl:template match="a">
<a id="{@id}(moved)">
<xsl:value-of select="'new value'"/>
</a>
</xsl:template>

相关内容

  • 没有找到相关文章

最新更新