XSLT1.0/为什么添加命名空间信息时XSL文件将停止呈现XML



我有一个工作正常的xsl文件。模板全部就绪,当根节点如下时,页面上会显示所有内容:

<Document>
  <...>
</Document>

但是,如果将命名空间信息添加到 xml 文档中,如下所示:

<Document  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi_schemaLocation="urn:hl7-org:v3 CDA_SDTC.xsd" xmlns="urn:hl7-org:v3" xmlns:cda="urn:hl7-org:v3" xmlns:sdtc="urn:hl7-org:sdtc">
  <...>
</Document>

我的样式表没有改变,它适用于第一个示例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ms="urn:schemas-microsoft-com:xslt"
  xmlns="http://www.w3.org/1999/xhtml">
  <xsl:template match="/">
  </xsl:template>
</xsl:stylesheet>

Web 输出上根本没有从 xml 文档中读取任何内容。这是什么原因呢?

我对 XSLT 文件进行了以下更改:

<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:hl7-org:v3 CDA_SDTC.xsd" 
xmlns="urn:hl7-org:v3" 
xmlns:cda="urn:hl7-org:v3" 
xmlns:sdtc="urn:hl7-org:sdtc"
>

但这会在 xsi:schemaLocation 上抛出错误,因为 v3 和 CDA 之间的空间。如果我像这样去掉那一行:

<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:hl7-org:v3" 
xmlns:cda="urn:hl7-org:v3" 
xmlns:sdtc="urn:hl7-org:sdtc"
>

然后我仍然没有从xml文档中呈现到页面上的任何内容。我知道我错过了一些东西,但我对 xsl 不够熟悉,不知道它是什么。

感谢您的任何帮助。

在 XPath 1.0 表达式中,不带前缀的名称始终引用不在命名空间中的节点。 如果要引用命名空间中的节点,则需要将相关的命名空间 URI 绑定到样式表中的前缀,并在 XPath 中使用该前缀。

在您的示例中,文档

<Document>
  <!--...-->
</Document>

具有本地名称为 Document 且没有命名空间的根元素,因此可以通过 /Document 的 XPath 表达式进行匹配。 但是该文件

<Document  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi_schemaLocation="urn:hl7-org:v3 CDA_SDTC.xsd" xmlns="urn:hl7-org:v3" xmlns:cda="urn:hl7-org:v3" xmlns:sdtc="urn:hl7-org:sdtc">
  <!--...-->
</Document>

urn:hl7-org:v3 命名空间中具有本地名称 Document 的根元素,该根元素与路径/Document不匹配。 为了匹配,您需要添加

xmlns:hl7="urn:hl7-org:v3"

<xsl:stylesheet> 标记,然后使用 XPath 表达式,如 /hl7:Document 。 由于默认命名空间xmlns="..."也适用于后代元素,因此您可能会发现必须在许多地方添加此前缀,例如 /Document/a/b可能需要更改为 /hl7:Document/hl7:a/hl7:b . 在 XSLT 2.0 中,您可以使用xpath-default-namespace但此选项在 1.0 中不可用。

元素名称在原始 XML 中没有前缀这一事实无关紧要 - 对 XPath 来说,重要的是本地名称和命名空间 URI。

您的输入 XML no 包含默认命名空间xmlns="urn:hl7-org:v3" 。这意味着您的 XSLT 还需要知道此命名空间。

XSLT 处理器在命名空间 URI 上匹配。因此,在 XSLT 中,您可以使用不同的前缀,例如将xmlns:pref="urn:hl7-org:v3"放在 XSLT 中。

您可以使用该前缀在 XSLT 中选择元素:<xsl:value-of select="/pref:rootElement/pref:childElement" />

最新更新