使用XSLT将XML转换为String

时间:2013-10-16 16:12:10

标签: xml xslt xpath

需要将XML转换为String

输入XML:

<Texts>
<text>123</text>
<text>456</text>
<text>789</text>
</Texts>

输出字符串

T1=123&T2=456&T3=789

我正在使用以下XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
        <xsl:for-each select="Texts">
            <xsl:apply-templates mode="concat" select="text" />
        </xsl:for-each>
</xsl:template>

<xsl:template match="text" mode="concat">
    <xsl:variable name="position" select="position()"/>
    <xsl:if test="position() = 1">
        <xsl:text>P($position)=</xsl:text>
    </xsl:if>
    <xsl:value-of select="." />
    <xsl:if test="position() = last()">
        <xsl:text></xsl:text>
    </xsl:if>
    <xsl:if test="position() = last()"> 
    <xsl:text>&amp;P$position=</xsl:text>
    </xsl:if>
</xsl:template> 

</xsl:stylesheet>

让我知道什么是错的。 XML中的元素文本可以是任意数字

4 个答案:

答案 0 :(得分:1)

有时使用xsl:for-each更容易:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:for-each select="Texts/text">
            <xsl:if test="position() != 1">&amp;</xsl:if>T<xsl:value-of select="position()" />=<xsl:value-of select="." />
        </xsl:for-each> 
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

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

  <xsl:template match="/">
    <xsl:apply-templates select="Texts/text" />
  </xsl:template>

  <xsl:template match="text">
    <xsl:value-of select="concat('P', position(), '=', .)" />
    <xsl:if test="position() &lt; last()">&amp;</xsl:if>
  </xsl:template> 

</xsl:stylesheet>

输出

P1=123&P2=456&P3=789

请注意,您实际上应该对每个<text>的值使用URL编码,但这不是内置于XSLT 1.0中(但2.0具有函数)。

如果您正在处理数字值,那么您应该没问题,否则您应该寻找将URL编码功能添加到样式表中的方法。有几种方法可以使用外部函数扩展XSLT,它取决于你应用的XSLT引擎。

答案 2 :(得分:1)

最简单/最快捷的方法是(如果你在XPath 2中):

 string-join(//text / concat("T", position(), "=", .), "&")

或者更好的是,如果你确实需要url编码,并将其逐字地放在XSLT中:

 string-join(//text / concat("T", position(), "=", encode-for-uri(.)), "&amp;")

答案 3 :(得分:0)

可以在XPath 2.0(以及XSLT 2.0)中完成,如下所示:

string-join(
  for $i in 1 to count(//text) 
    return concat('T', $i, '=', (//text)[$i]), 
  '&')