我有XSLT代码,可以从一种XML格式转换为另一种格式。源文档具有带名称空间前缀的元素。输出的目标文档应仅包含没有名称空间前缀的元素和属性。但是,我有一个场景,其中目标文档中生成的属性前缀为命名空间
例如:
<PaymentForm otc:CardNumber="xxxxx">
我想知道在什么情况下会发生这种情况,以及可采取哪些措施来防止它。注意:我已经将处理器指令exclude-result-prefixes添加到XSLT代码中,我认为这将确保元素和属性不会被添加前缀。
非常感谢所有建议和/或建议。
在上面的例子中,我有以下生成目标文档的XSLT代码片段:
<xsl:template match="otc:PaymentCard" mode="profile">
<xsl:variable name="cardnumber" select="otc:CardNumber"/>
<xsl:variable name="expiry" select="otc:ExpiryDate"/>
<xsl:variable name="cardtype" select="otc:CardType"/>
<xsl:variable name="cardholder" select="otc:CardHolderName"/>
<PaymentCard>
<xsl:attribute name="ExpireDate"><xsl:value-of select="$expiry"/></xsl:attribute>
<xsl:attribute name="CardNumber"><xsl:value-of select="$cardnumber"/></xsl:attribute>
<xsl:attribute name="CardType"><xsl:value-of select="$cardtype"/></xsl:attribute>
<CardHolderName><xsl:value-of select="$cardholder"/></CardHolderName>
</PaymentCard>
</xsl:template>
在这种特定情况下,ExpireDate被正确转换,CardNumber和CardType被转换为otc名称空间前缀。
e.g。
<otc:PaymentForm>
<otc:PaymentCard ExpireDate="2022-12-31" otc:CardNumber="************1111" otc:CardType="VI">
<otc:CardHolderName>Mr. J. Banks</otc:CardHolderName>
</otc:PaymentCard>
</otc:PaymentForm>
答案 0 :(得分:1)
我想知道在什么情况下会发生这种情况
当您将属性创建为文字结果元素的一部分,并使用名称空间前缀时:
<example otc:att="x"/>
使用xsl:属性并在名称中包含前缀
<xsl:attribute name="otc:att"/>
使用xsl:属性并使用命名空间属性
时 <xsl:attribute name="att" namespace="http://otc.com/example"/>
使用<xsl:copy/>
或<xsl:copy-of/>
答案 1 :(得分:0)
我想知道在什么情况下会发生这种情况
复制具有命名空间的属性时可能会发生这种情况。复制也复制命名空间 - 前缀将属性标记为属于在输出中某处绑定到此前缀的命名空间。
我已将处理器指令exclude-result-prefixes添加到 我假设的XSLT代码将确保元素和 属性不会加前缀。
不,那不是exclude-result-prefixes
所做的。
可采取哪些措施来防止它。
我不需要复制,你需要创建一个 new 属性,它具有与源代码相同的本地名称和值 - 就像你对元素所做的那样,我猜想。
答案 2 :(得分:0)
正确转换ExpireDate和CardNumber和 CardType使用otc名称空间前缀
进行转换
我无法重现这一点。
XML输入
<?xml version="1.0" encoding="UTF-8"?>
<otc:PaymentCard xmlns:otc="httP://www.otc.com">
<otc:CardNumber>12345</otc:CardNumber>
<otc:ExpiryDate>12-02-2014</otc:ExpiryDate>
<otc:CardType>Master</otc:CardType>
<otc:CardHolderName>Johnson</otc:CardHolderName>
</otc:PaymentCard>
<强>样式表强>
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:otc="httP://www.otc.com"
exclude-result-prefixes="#all">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="otc:PaymentCard">
<PaymentCard>
<xsl:attribute name="ExpireDate"><xsl:value-of select="otc:ExpiryDate"/></xsl:attribute>
<xsl:attribute name="CardNumber"><xsl:value-of select="otc:CardNumber"/></xsl:attribute>
<xsl:attribute name="CardType"><xsl:value-of select="otc:CardType"/></xsl:attribute>
<CardHolderName><xsl:value-of select="otc:CardHolderName"/></CardHolderName>
</PaymentCard>
</xsl:template>
</xsl:transform>
XML输出
如您所见,没有任何前缀。用Saxon 9.5测试。
<?xml version="1.0" encoding="UTF-8"?>
<PaymentCard ExpireDate="12-02-2014" CardNumber="12345" CardType="Master">
<CardHolderName>Johnson</CardHolderName>
</PaymentCard>