在XSLT中创建根元素

时间:2016-01-15 13:02:34

标签: xslt

我有一个输入文档,我只想提取前缀为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>

3 个答案:

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

以上对我有用:)