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

时间:2016-12-20 04:31:57

标签: xslt xslt-2.0

我知道这是一个简单的问题。我还在学习并熟悉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="/">,我仍然对我需要放置的节点感到困惑。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

如果您正在使用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>

答案 1 :(得分:1)

如果您确实在使用XSLT 2.0,则只需添加:

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

stylesheet标记,并将其他所有内容保留原样。