无法获得正确的XSLT输出 [英] Can't get correct XSLT output
本文介绍了无法获得正确的XSLT输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个如下所示的XML:
<?xml version="1.0" encoding="UTF-8"?>
<Section>
<Chapter>
<nametable>
<namerow>
<namecell stuff="1">
<entity>A</entity>
</namecell>
<namecell stuff="2">
<entity>B</entity>
</namecell>
</namerow>
</nametable>
</Chapter>
</Section>
我的XSLT是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="Section/Chapter//nametable"/>
</xsl:template>
<xsl:template match="nametable">
<xsl:for-each select="./namerow">
<xsl:value-of select="./namecell/@stuff"/>
<xsl:value-of select="./namecell" />
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
奇怪的是,我得到的是这个订单12 A B的输出,我以为我会得到1 A 2 B。
不确定为什么?
TIA,
约翰
推荐答案
您的问题在这里:
<xsl:for-each select="./namerow">
<xsl:value-of select="./namecell/@stuff"/>
<xsl:value-of select="./namecell" />
</xsl:for-each>
与XSLT 2.0中的XSLT 1.0不同,xsl:value-of
指令按其select
属性中指定的顺序输出所有项。
这意味着
<xsl:value-of select="./namecell/@stuff"/>
输出所有stuff
属性(%1和%2)
然后是下一条指令:
<xsl:value-of select="./namecell" />
输出两个namecell
子级的字符串值--分别为"A"
和"B"
。
解决方案:
替换:
<xsl:for-each select="./namerow">
<xsl:value-of select="./namecell/@stuff"/>
<xsl:value-of select="./namecell" />
</xsl:for-each>
与:
<xsl:for-each select="./namerow">
<xsl:value-of select="./namecell/(@stuff|entity)"/>
</xsl:for-each>
此修改的完整代码为:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="Section/Chapter//nametable"/>
</xsl:template>
<xsl:template match="nametable">
<xsl:for-each select="./namerow">
<xsl:value-of select="./namecell/(@stuff|entity)"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
以及在提供的XML文档上应用此转换时:
<Section>
<Chapter>
<nametable>
<namerow>
<namecell stuff="1">
<entity>A</entity>
</namecell>
<namecell stuff="2">
<entity>B</entity>
</namecell>
</namerow>
</nametable>
</Chapter>
</Section>
产生想要的结果:
1 A 2 B
第二个解决方案(可能是您最初打算做的):
替换:
<xsl:template match="nametable">
<xsl:for-each select="./namerow">
<xsl:value-of select="./namecell/@stuff"/>
<xsl:value-of select="./namecell" />
</xsl:for-each>
</xsl:template>
与:
<xsl:template match="nametable">
<xsl:for-each select="namerow/namecell">
<xsl:value-of select="@stuff"/>
<xsl:value-of select="entity"/>
</xsl:for-each>
</xsl:template>
现在您再次获得想要的结果:
1A2B
这篇关于无法获得正确的XSLT输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文