我有一个工作正常的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" />