2016-01-15 43 views
-2

我有一个输入文档,我只想提取带有前缀ppp的元素。前缀为ppp的所有元素都处于同一级别。在XSLT中创建根元素

输入:

<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> 
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

-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> 

上述工作对我来说:)

+0

这不提供请求的输出。它不会复制'ppp:element'节点中包含的文本节点 - 但它会复制整个XML输入中的所有其他文本节点。 –