我知道这是一个简单的问题。我还在学习并熟悉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="/">
,我仍然对我需要放置的节点感到困惑。谢谢你的帮助。
答案 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
标记,并将其他所有内容保留原样。