xsl使用命名空间添加新元素

时间:2014-11-03 08:55:50

标签: xml xslt

我有这个xml:

<Row>

<one>1</one>
<two>2</two>
<tree>3</tree>
<four>4</four>
<five>5</five>

</Row>

我希望得到结果:

<n0:Result xmlns:ns0="http://www.my.schemas/schemas/event1.xsd"
           xmlns:ns1="http://www.my.schemas/schemas/event2.xsd"
           xmlns:ns2="http://www.my.schemas/schemas/event3.xsd">
    <n1:group1>
        <n2:one>1</n2:one>
        <n2:two>2</n2:two>
    </n1:group1>

    <n1:group2>
        <n2:tree>3</n2:tree>
        <n2:four>4</n2:four>
    </n1:group2>

    <n0:five>5</n0:five>

</Result>

我现在的xsl是:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
           xmlns:ns0="http://www.my.schemas/schemas/event1.xsd"
           xmlns:ns1="http://www.my.schemas/schemas/event2.xsd"
           xmlns:ns2="http://www.my.schemas/schemas/event3.xsd" >
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>


    <xsl:template match="Row">
    <result>
                <group1>
                    <xsl:apply-templates select="one|two"/>
                </group1>
                <group2>
                    <xsl:apply-templates select="tree|four"/>
                </group2>

                <xsl:apply-templates select="five"/>
    </result>   
    </xsl:template>

</xsl:stylesheet>

如何将所需的命名空间添加到新元素和旧元素? 我不知道如何使用分组和新元素,仅使用现有元素。

1 个答案:

答案 0 :(得分:2)

只需在你想要的样本中写下这些元素,然后

<xsl:template match="Row">
<result>
            <group1>
                <xsl:apply-templates select="one|two"/>
            </group1>
            <group2>
                <xsl:apply-templates select="tree|four"/>
            </group2>

            <xsl:apply-templates select="five"/>
</result>   
</xsl:template>

变为

<xsl:template match="Row">
<ns0:result>
            <ns1:group1>
                <xsl:apply-templates select="one|two"/>
            </ns1:group1>
            <ns1:group2>
                <xsl:apply-templates select="tree|four"/>
            </ns1:group2>

            <xsl:apply-templates select="five"/>
</ns0:result>   
</xsl:template>

显然,您需要确保其他模板也在您希望它们所属的命名空间中输出它们的元素。

更完整的例子是

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
           xmlns:ns0="http://www.my.schemas/schemas/event1.xsd"
           xmlns:ns1="http://www.my.schemas/schemas/event2.xsd"
           xmlns:ns2="http://www.my.schemas/schemas/event3.xsd" >
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>


<xsl:template match="Row">
<ns0:result>
            <ns1:group1>
                <xsl:apply-templates select="one|two"/>
            </ns1:group1>
            <ns1:group2>
                <xsl:apply-templates select="tree|four"/>
            </ns1:group2>

            <xsl:apply-templates select="five"/>
</ns0:result>   
</xsl:template>

</xsl:stylesheet>

然后,正如我所说,如果您转换其他元素,您将添加模板,因此您还需要

<xsl:template match="one | two">
  <xsl:element name="ns1:{local-name()}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

<xsl:template match="three | four">
  <xsl:element name="ns2:{local-name()}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

<xsl:template match="five">
  <xsl:element name="ns0:{local-name()}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

完全是

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
           xmlns:ns0="http://www.my.schemas/schemas/event1.xsd"
           xmlns:ns1="http://www.my.schemas/schemas/event2.xsd"
           xmlns:ns2="http://www.my.schemas/schemas/event3.xsd" >
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>


<xsl:template match="Row">
<ns0:result>
            <ns1:group1>
                <xsl:apply-templates select="one|two"/>
            </ns1:group1>
            <ns1:group2>
                <xsl:apply-templates select="tree|four"/>
            </ns1:group2>

            <xsl:apply-templates select="five"/>
</ns0:result>   
</xsl:template>

    <xsl:template match="one | two">
      <xsl:element name="ns1:{local-name()}">
        <xsl:apply-templates/>
      </xsl:element>
    </xsl:template>



    <xsl:template match="three | four">
      <xsl:element name="ns2:{local-name()}">
        <xsl:apply-templates/>
      </xsl:element>
    </xsl:template>



    <xsl:template match="five">
      <xsl:element name="ns0:{local-name()}">
        <xsl:apply-templates/>
      </xsl:element>
    </xsl:template>


</xsl:stylesheet>