无法读取 xslt 中的名称空间和属性

Can't read the namespaces and attribute in xslt

我知道这是个简单的问题。我仍在学习并熟悉 XSLT 编码。我的 XSLT 有问题,我不知道我做的是否正确。我需要从输入文件中获取值并将其存储在新元素标记名称中,并且我不需要填充父根元素上的名称空间和属性。我对此进行了研究,看到了很多参考资料,但我无法应用。如果根元素没有任何名称空间和属性,我制作的 XSLT(v02) 工作正常(只需从引用中复制)。但是,当我放置名称空间和属性时,没有填充任何输出。

输入文件

<Root xmlns="http://abcd.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" releaseID="9.2" versionID="2.12.3" xsi:schemaLocation="abcd.com abcd.xsd">
    <Element>
        <Field>AAAAA</Field>
    </Element>
    <Element>
        <Field>BBBBB</Field>
    </Element>
    <Element>
        <Field>CCCCC</Field>
    </Element>

xslt 文件

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
    <NewRecord>
        <xsl:for-each select="Root/Element">
            <NewTransaction>
                <Position>
                    <xsl:value-of select="position()"/>
                </Position>
                <TransactionID>
                    <xsl:value-of select="Field"/>
                </TransactionID>
            </NewTransaction>
        </xsl:for-each>
    </NewRecord>
</xsl:template>

生成输出

<NewRecord/>

我的预期输出应该是这样的:

<NewRecord>
<NewTransaction>
    <Position>1</Position>
    <TransactionID>AAAAA</TransactionID>
</NewTransaction>
<NewTransaction>
    <Position>2</Position>
    <TransactionID>BBBBB</TransactionID>
</NewTransaction>
<NewTransaction>
    <Position>3</Position>
    <TransactionID>CCCCC</TransactionID>
</NewTransaction>

我认为问题出在 <xsl:template match="/">,我仍然对需要放置的节点感到困惑。感谢您的帮助。

如果您使用的是 xslt 1.0,则必须在样式表中声明相同的命名空间,并使用映射到命名空间的前缀来限定元素的名称:

前缀可以随意。我选择 abcd 来匹配您的示例,但它可以是任何合法标识符。

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:abcd="http://abcd.com">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <NewRecord>
            <xsl:for-each select="abcd:Root/abcd:Element">
                <NewTransaction>
                    <Position>
                        <xsl:value-of select="position()"/>
                    </Position>
                    <TransactionID>
                        <xsl:value-of select="abcd:Field"/>
                    </TransactionID>
                </NewTransaction>
            </xsl:for-each>
        </NewRecord>
    </xsl:template>
</xsl:stylesheet>

如果你真的使用XSLT 2.0,你只需要添加:

xpath-default-namespace="http://abcd.com"

添加到 stylesheet 标签,其他一切保持原样。