0

我的 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 方案,问题是根元素有 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>

结果是:

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

我如何摆脱 xmlns=""???

谢谢...

4

2 回答 2

1

您实际得到的结果是……(尽管我怀疑您确实打算将BBB包装在xsl:element标记中)

<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=''存在,您可以编写一个模板来从根目录中删除默认名称空间。为此,不要更改xsl:element ,而是尝试将此额外模板添加到 XSLT

<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根本不在命名空间中。

于 2013-09-17T17:15:51.400 回答
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>

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

于 2013-09-17T17:19:40.553 回答