我有一个相当大的XML文件,我想把它分解成更小的文件。我可以在大多数情况下使用xsl:result-document
和xsl: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>