我有一个输入文档,我只想提取前缀为ppp
的元素。前缀为ppp
的所有元素都在同一级别上。
输入:
<root>
<ppp:element>aaa</ppp:element>
<ppp:element>ccc</ppp:element>
<lala:element>PPP</lala:element>
<rrr:element>dsfsdbfsdf</rrr:element>
</root>
在我的XSLT中,我将前缀为ppp
的所有元素复制到输出文件中。
问题是我在输出文件中没有root
个元素。
所以我需要创建一个root
元素。在root
元素中,我应该使用前缀ppp
复制所有元素。
我的XSLT:
<xsl:template match="node()">
<xsl:apply-templates select="node()"/>
</xsl:template>
<xsl:template match="ppp:*">
<xsl:copy>
<xsl:apply-templates select="ppp:*/node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
期望的输出:
<root>
<ppp:element>aaa</ppp:element>
<ppp:element>ccc</ppp:element>
</root>
答案 0 :(得分:0)
如果输入格式正确,那么您的所有样式表都必须:
<xsl:template match="/root">
<xsl:copy>
<xsl:copy-of select="ppp:*"/>
</xsl:copy>
</xsl:template>
答案 1 :(得分:0)
一个更通用的选项,抛弃所有元素,无论它们在XML树中的哪个位置,如果它们具有ppp
前缀(无论命名空间URI如何 - 这都是不好的做法!但它是严格按照你的要求),同时保留输入的根源:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ppp="http://example.org">
<xsl:output method="xml" />
<xsl:template match="/|@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[substring-before(name(), ':') != 'ppp' and not(. = /)]" />
</xsl:stylesheet>
以下是XSLT转换演示:http://xsltransform.net/6r5Gh3y/2。
答案 2 :(得分:-1)
日Thnx。
<xsl:template match="/">
<ppp:name>
<xsl:apply-templates select="node()"></xsl:apply-templates>
</ppp:name>
</xsl:template>
<xsl:template match="ppp:*">
<xsl:copy>
<xsl:apply-templates select="ppp:*/node()"/>
</xsl:copy>
</xsl:template>
以上对我有用:)