1

我有一个运行良好的 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"
>

但是由于 v3 和 CDA 之间的空间,这会在 xsi:schemaLocation 上引发错误。如果我像这样取出那一行:

<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 不够熟悉,不知道它是什么。

谢谢你的帮助。

4

2 回答 2

1

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

在您的示例中,文档

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

有一个带有本地名称Document但没有命名空间的根元素,因此它可以由 . 的 XPath 表达式匹配/Document。但是文件

<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>

Document在命名空间中有一个具有本地名称的根元素urn:hl7-org:v3,它与路径/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。

于 2013-09-16T13:34:02.277 回答
0

您的输入 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" />

于 2013-09-16T13:25:53.767 回答