xslt1.0 / xml - 为什么xsl文件会在添加名称空间信息时停止呈现xml

时间:2013-09-16 12:53:09

标签: xml xslt xslt-1.0

我有一个工作正常的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不够熟悉,不知道它是什么。

感谢您的帮助。

2 个答案:

答案 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" />