前缀命名空间可变性和xlst

时间:2017-05-25 13:11:23

标签: xml xslt

我的xml的前缀命名空间可能因源而异,但结构不同。 例如,有时候我有'" t:"前缀

 <t:DICT>
    <t:noConsultationDuTeleservice>2015071717689S</t:noConsultationDuTeleservice>
    <t:noAffaireDeLexecutantDesTravaux>2015/181/A</t:noAffaireDeLexecutantDesTravaux>
</t:DICT>

`来自另一个来源,它是&#34; d:&#34;前缀

<d:DICT>
    <d:noConsultationDuTeleservice>2015071717689S</d:noConsultationDuTeleservice>
    <d:noAffaireDeLexecutantDesTravaux>2015/181/A</d:noAffaireDeLexecutantDesTravaux>
</d:DICT>

如何调整我的xslt在select中删除命名空间<xsl:value-of select ="DICT/noConsultationDuTeleservice"/>

1 个答案:

答案 0 :(得分:1)

正如我在评论中所说,你不能将命名空间前缀与命名空间本身混淆,命名空间本身是主要由URI标识的抽象实体。命名空间及其标识URI是通用的;名称空间前缀是特定于文档的。即使在单个文档中,不同的名称空间前缀也可能对应于相同的名称空间(根据它们是否绑定到相同的名称空间URI来判断)。它们对XSLT的重要性仅限于它们与特定命名空间URI的关联。

您提供了具有相同本地名称但名称空间前缀不同的输入元素的示例。这些元素应出现在与其各自前缀关联的名称空间声明的范围内,否则源文档不符合XML命名空间。此外,依赖于元素名称的本地部分对两个前缀具有相同意义的事实实际上是一个断言,您希望前缀与相同的命名空间相关联。 / p>

XSLT,通过XPath,匹配节点,而不是文档中字面上出现的限定名称,而是匹配扩展名称,它们是由可能为空的名称空间 <组成的有序对。 em> URI 以及他们的限定名称的本地部分。因此,输入文档中的不同名称空间前缀是无关紧要的;重要的是每个前缀绑定的名称空间URI。

另一方面,由于XSLT通过扩展名匹配节点,因此您的XSLT确实需要考虑源文档所针对的非null命名空间。元素名称属于。您可以在XSLT 1.0中通过在样式表中为该命名空间声明自己的命名空间前缀来执行此操作,以便它出现在涉及这些名称的表达式的范围内,并在表达式中使用适当的前缀名称。

例如,鉴于此源文档:

<d:root xmlns:d="http://some.organization.com/Namespace">
<d:DICT>
  <d:noConsultationDuTeleservice>2015071717689S</d:noConsultationDuTeleservice>
  <d:noAffaireDeLexecutantDesTravaux>2015/181/A</d:noAffaireDeLexecutantDesTravaux>
</d:DICT>
</d:root>

您可以编写如下的XSLT:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns="http://some.organization.com/Namespace">

  <xsl:template match="ns:root">
    <noConsultation>
      <xsl:value-of select="ns:DICT/ns:noConsultationDuTeleservice"/>
    </noConsultation>
  </xsl:template>

</xsl:stylesheet>

对于对同一名称空间使用不同前缀的输入文档,例如

,这同样适用
<t:root xmlns:t="http://some.organization.com/Namespace">
<t:DICT>
  <t:noConsultationDuTeleservice>2015071717689S</t:noConsultationDuTeleservice>
  <t:noAffaireDeLexecutantDesTravaux>2015/181/A</t:noAffaireDeLexecutantDesTravaux>
</t:DICT>
</t:root>