需要将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>&P$position=</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
让我知道什么是错的。 XML中的元素文本可以是任意数字
答案 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">&</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() < last()">&</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(.)), "&")
答案 3 :(得分:0)
可以在XPath 2.0(以及XSLT 2.0)中完成,如下所示:
string-join(
for $i in 1 to count(//text)
return concat('T', $i, '=', (//text)[$i]),
'&')