我是XSL / XSLT的新手。我想将一个xml文档复制到另一个文件中,但是要替换一些命名空间标记和一些具有某些特殊属性的标记。例如:
<root>
<ext:foo>Test</ext:foo>
<bar>Bar</bar>
<baz id="baz" x="test">
<something/>
</baz>
</root>
应该改写成:
<root>
--Test--
<bar>Bar</bar>
xxx<baz id="baz">
<something/>
</baz>xxx
</root>
是否可以复制整个XML,然后应用一些规则来替换我想要替换的标签?
答案 0 :(得分:6)
您可以复制某些节点并使用不同的规则重写其他节点。要保持<root>
和<bar>
相同,并重新编写<baz>
,请尝试以此方式(未经测试)作为起点:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<!-- Match <baz> and re-write a little -->
<xsl:template match="baz">
xxx<baz id="{@id}">
<xsl:apply-templates />
</baz>xxx
</xsl:template>
<!-- By default, copy all elements, attributes, and text -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
假设你的.xml文件对于ext:xmlns:ext =“www.foo.com”具有相同的命名空间,这个xslt会产生你的输出,虽然你必须把它带上一粒盐,因为它没有完全检查什么,只为这个特定情况产生你的输出。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ext="www.foo.com">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/root">
<root>
<xsl:text>--</xsl:text><xsl:value-of select="./ext:foo/text()"/><xsl:text>--</xsl:text>
<xsl:copy-of select="./bar"/>
<xsl:variable name="bazElem" select="./baz"/>
<xsl:text>xxx</xsl:text><baz id="{$bazElem/@id}">
<xsl:copy-of select="$bazElem/something"/>
</baz><xsl:text>xxx</xsl:text>
</root>
</xsl:template>
</xsl:stylesheet>