使用XSLT转换XML格式

时间:2013-12-01 20:27:59

标签: xslt

我的要求是转换以下数组

<array>
    <value>755</value>
    <value>5861</value>
    <value>4328</value>
</array>

到这个数组。

<array>
   <int>755</int>
   <int>5861</int>
   <int>4328</int>
</array>

以下是我的XSLT代码进行转换&amp;有用。这是正确的方法,因为在一个post我看到了“身份模板”的使用。但是我还没用过它。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/array">
            <xsl:element name="array">
                    <xsl:for-each select="value">
                        <xsl:element name="int">
                            <xsl:value-of select="." />
                        </xsl:element>
                  </xsl:for-each>   
            </xsl:element>              
    </xsl:template>

</xsl:stylesheet>

3 个答案:

答案 0 :(得分:1)

你可以这样做:

<xsl:template match="/array">
    <array>
        <xsl:for-each select="value">
            <int>
                <xsl:value-of select="." />
            </int>
        </xsl:for-each>   
    </array>              
</xsl:template>

答案 1 :(得分:1)

您当前的方法有效。它更像是"pull" style样式表。 “推送”样式使用apply-templates。

你可以通过使用元素文字来缩短它,这使它更容易阅读:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/array">
        <array>
            <xsl:for-each select="value">
                <int>
                    <xsl:value-of select="." />
                </int>
            </xsl:for-each>   
        </array>              
    </xsl:template>

</xsl:stylesheet>

使用身份模板和value元素的自定义模板的解决方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes"/>
    <!--identity template, which copies every attribute and 
        node(element, text, comment, and processing instruction) 
        that it matches and then applies templates to all of it's 
        attributes and child nodes (if there are any) -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!--Specialized template that matches the value element.
        Because it is more specific than the identity template above it has
        a higher priority and will match when the value element is encountered.
        It creates an int element and then applies templates to any attributes 
        and child nodes of the value element -->
    <xsl:template match="value">
        <int>
            <xsl:apply-templates select="@*|node()"/>
        </int>
    </xsl:template>

</xsl:stylesheet>

答案 2 :(得分:0)

以下是您所接受的链接答案的引用:

  

XSL无法取代任何东西。您可以做的最好的事情是复制要保留的部分,然后输出您想要更改的部分,而不是您不想保留的部分。

这就是身份模板发挥作用的地方:它复制未被另一个匹配模板定位的所有内容。结果是,如果您的基本XML包含除了数组之外的其他内容,那么您还应该在xslt中包含身份模板。但是,如果您确定您的xml不包含其他内容,那么您不需要它。