xslt - 无法获得正确的 XSLT 输出

标签 xslt xslt-2.0 xpath-2.0

我有一个像这样的 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>

奇怪的是我得到的输出顺序为 1 2 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 1.0 不同,XSLT 2.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 - 无法获得正确的 XSLT 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9425190/

相关文章:

java - 如何使用XPath通过另一个属性值获取属性内容?

xml - Xpath:紧跟在元素后面的第一个字母/字符串

xslt - 命名空间的排序

html - 和 之间有什么区别?

java - 为什么 fn :matches and fn:replace throwing parse errors in XSLT 2. 是 0?

C++ XLST 转换无法使用 MSXML 3.0

xslt - 在 XSLT 变量中构造 XML 元素序列

java - 由于 saxon9.jar,JAXB 解码时出错

xml - 在 xslt 中创建序列号

xml - 这种情况下的 Xpath 查询 --grouping values?