我有一个工作正常的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不够熟悉,不知道它是什么。
感谢您的帮助。
答案 0 :(得分:1)
在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>
在Document
命名空间中有一个本地名称为urn:hl7-org:v3
的根元素, 与路径/Document
不匹配。为了匹配您需要添加的内容
xmlns:hl7="urn:hl7-org:v3"
到<xsl:stylesheet>
标记,然后使用像/hl7:Document
这样的XPath表达式。由于默认命名空间xmlns="..."
也适用于后代元素,因此您可能会发现必须在许多地方添加此前缀,例如/Document/a/b
可能需要更改为/hl7:Document/hl7:a/hl7:b
。在XSLT 2.0中,您可以使用xpath-default-namespace
,但此选项在1.0中不可用。
元素名称在原始XML中没有前缀的事实是无关紧要的 - 对XPath来说重要的是本地名称和名称空间URI。
答案 1 :(得分: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" />