如何防止属性在输出中加前缀?

时间:2014-08-15 12:44:04

标签: xml xslt namespaces

我有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>

3 个答案:

答案 0 :(得分:1)

  

我想知道在什么情况下会发生这种情况

  1. 当您将属性创建为文字结果元素的一部分,并使用名称空间前缀时:

    <example otc:att="x"/>

  2. 使用xsl:属性并在名称中包含前缀

    <xsl:attribute name="otc:att"/>

  3. 使用xsl:属性并使用命名空间属性

    <xsl:attribute name="att" namespace="http://otc.com/example"/>

  4. 使用<xsl:copy/><xsl:copy-of/>

  5. 从源文档复制命名空间属性时

答案 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>