我有一个问题。
元素响应必须没有名称空间(它们是定义的根元素)。
输入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>
可能解决方案必须更好。
答案 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"
。但我认为这里还有一些你没有解释清楚的事情。