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

问题描述:

我有一个xsl文件,它一直工作正常。这些模板全部到位,一切都显示在页面上,当根节点如下:xslt1.0/xml - 为什么xsl文件停止在添加名称空间信息时呈现xml

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

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

感谢您的任何帮助。

+0

现在看来,您的根元素'Document'属于命名空间xmlns =“urn:hl7-org:v3”,您必须将其包含在您的XSLT中 –

+0

这是否意味着只需添加到顶部的xmlns列表xslt文件? – jjasper0729

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

+0

我现在有= “http://www.w3.org/1999/xhtml” 在样式表中的xmlns。如果我把另一个放进去,它会抛出一个错误。我该如何协调一下,如果我用xml文档中的内容替换了xmlns,还需要为xpath表达式加前缀吗? – jjasper0729

+0

@ jjasper0729你不需要到'的xmlns = ...'添加到样式表,只有前缀映射的xmlns':HL7 = ...'和'HL7:'前缀的表达式。您在样式表中使用的前缀不必与文档中的前缀匹配,重要的是前缀映射到的URI。 –

+0

现在正在使用hl7:前缀添加到所有内容。有没有一种方法使xslt1.0使默认,所以我不必把它放到一切?这是一个有很多节点需要的大文件。 – jjasper0729

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

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

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

+0

我放了一些编辑来显示不同的测试,我已经改变了xmlns的值,但无济于事。 – jjasper0729

+0

http://www.xml.com/pub/a/2001/04/04/trxml/ –