如何使用XSLT添加名称空间元素

时间:2017-05-11 09:31:01

标签: xml xslt

我有一个问题。

元素响应必须没有名称空间(它们是定义的根元素)。

输入XSLT:

$_GET['user_id']

输出XML:

    <xsl:stylesheet
        xpath-default-namespace="http://www.iata.org/IATA/EDIST"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:h="http://www.iata.org/IATA/EDIST"
        version="1.0"
        >

  <xsl:template match="h:Response[not(h:OrderViewProcessing)]">
    <Response xmlns="http://www.iata.org/IATA/EDIST">
      <OrderViewProcessing>
            <MarketingMessages>
                <MarketingMessage>
                    <Text>
                      Error text
                    </Text>
                </MarketingMessage>
            </MarketingMessages>
        </OrderViewProcessing>
      <xsl:apply-templates/>
    </Response>
  </xsl:template>

</xsl:stylesheet>

我需要像XML一样:

<Response    xmlns:h="http://www.iata.org/IATA/EDIST"
             namespace="http://www.iata.org/IATA/EDIST">

      <OrderViewProcessing>
         <MarketingMessages>
            <MarketingMessage>
               <Text>
              Error Text
                    </Text>
            </MarketingMessage>
         </MarketingMessages>
      </OrderViewProcessing>

</Response>

如果您删除xmlns =&#34; http://www.iata.org/IATA/EDIST&#34;在XSLT中,然后xmlns =&#34;&#34;在XML中变为空。

更新

这个问题以这种方式解决了:

<Response>

      <OrderViewProcessing>
         <MarketingMessages>
            <MarketingMessage>
               <Text>
              Error Text
                    </Text>
            </MarketingMessage>
         </MarketingMessages>
      </OrderViewProcessing>

</Response>

可能解决方案必须更好。

1 个答案:

答案 0 :(得分:1)

您正在使用xpath-default-namespace和version =“1.0”,这看起来不一致,因为此属性仅在XSLT 2.0中定义。 始终需要告诉我们您使用的是哪个版本的XSLT。

您在命名空间"http://www.iata.org/IATA/EDIST"中显式创建了Response元素,尽管您说它希望它不在命名空间中。你为什么这样做?

您说您的输出具有属性namespace="http://www.iata.org/IATA/EDIST",但您的XSLT中没有任何内容可以设想生成此属性。我认为这必须来自您的XSLT的一些实验性变体。

通常,如果需要在样式表中声明名称空间并且不希望将它们复制到输出中,则应在xsl:stylesheet元素上指定exclude-result-prefixes="#all"。但我认为这里还有一些你没有解释清楚的事情。