在开头提供标签列表时替换标签

时间:2013-09-17 15:18:44

标签: xslt xpath

我的xml输入是:

<?xml version="1.0" encoding="windows-1255"?>
<ns0:PatMedData xmlns="http://Maccabi.Hospitals.Integration"  xmlns:ns0="http://Maccabi.Hospitals.Integration">
<MessageId>AS80000000000456</MessageId>
</ns0:PatMedData>

我无法更改xml方案,问题是root元素有 xmlns =“http://Maccabi.Hospitals.Integration”和xmlns:ns0 =“http://Maccabi.Hospitals.Integration” 这会导致奇怪的问题

我试过这个xslt:

<xsl:stylesheet version="1.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//*[local-name() = 'MessageId']">
<xsl:element name="brlName"/> 
<xsl:text>BBB</xsl:text>
</xsl:template>
</xsl:stylesheet>

reuslt是:

  <brlName xmlns="">BBB</brlName>

我如何摆脱xmlns =“”???

谢谢......

2 个答案:

答案 0 :(得分:1)

你实际得到的结果就是这个...(虽然我怀疑你的确意味着在 xsl:element 标签中包装 BBB

<ns0:PatMedData xmlns="http://Maccabi.Hospitals.Integration"
                xmlns:ns0="http://Maccabi.Hospitals.Integration">
    <brlName xmlns=""/>BBB
</ns0:PatMedData>

混淆在于根元素有两个名称空间声明。两者都具有相同的URI,但是一个被声明为默认命名空间,另一个被绑定为前缀 ns0 。当您输出 brlName 时,您输出的是没有命名空间,但由于根元素已声明默认命名空间,因此输出为<brlName xmlns=""/>以显示它没有命名空间,否则它会成为声明的现有命名空间的一部分。

您未说的是新的 brlName 是否属于同一名称空间,或者是否不应位于任何名称空间中。

如果您希望 brlName 成为与根元素相同的命名空间的一部分,请将 xsl:element 更改为此

<xsl:element name="brlName" namespace="{namespace-uri()}" /> 

这将输出以下内容:

<ns0:PatMedData xmlns="http://Maccabi.Hospitals.Integration"
                xmlns:ns0="http://Maccabi.Hospitals.Integration">
    <brlName/>BBB
</ns0:PatMedData>

但是,如果您希望 brlName 不在任何名称空间中,但实际上不喜欢xlmns=''存在,您可以编写一个模板以从根目录中删除默认名称空间。要执行此操作,请尝试将此额外模板添加到XSLT

,而不是更改 xsl:element
<xsl:template match="/*">
   <xsl:element name="{name()}" namespace="{namespace-uri()}">
       <xsl:apply-templates select="node()|@*"/>
   </xsl:element>
</xsl:template>

这应该产生以下结果:

<ns0:PatMedData xmlns:ns0="http://Maccabi.Hospitals.Integration">
   <brlName/>BBB
</ns0:PatMedData>

重新迭代两个解决方案是不一样的。第一个解决方案将 brlName 与根 PatMedData 元素放在同一名称空间中。在第二个中, brlName 根本不在命名空间中。

答案 1 :(得分:0)

变化:

<xsl:element name="brlName"/> 
<xsl:text>BBB</xsl:text>

要:

<xsl:element name="brlName" namespace="http://Maccabi.Hospitals.Integration">
    <xsl:text>BBB</xsl:text>
</xsl:element>

但是如果要添加一些元素,最好声明命名空间