【问题标题】:How to add namespace element using XSLT如何使用 XSLT 添加命名空间元素
【发布时间】:2017-05-11 09:31:00
【问题描述】:

我有问题。

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

输入 XSLT:

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

我需要 XML 之类的:

<Response>

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

</Response>

如果您在 XSLT 中删除 xmlns = "http://www.iata.org/IATA/EDIST",则 XML 中的 xmlns = "" 变为空。

更新

这个问题是这样解决的:

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

或许,解决方案一定更好。

【问题讨论】:

  • apim 前缀不在您的 XSLT 中,因此它必须来自您的输入 XML。我们需要查看输入 XML 以确定每个命名空间的来源以及给定元素所在的上下文。

标签: xml xslt


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    相关资源
    最近更新 更多