无法读取 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
标签,其他一切保持原样。
我知道这是个简单的问题。我仍在学习并熟悉 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
标签,其他一切保持原样。