我在这里使用XML文件。
http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml
我写了这段代码
<xsl:for-each select="registry/record">但是,由于XML中的这一行,它永远找不到任何东西。
<registry xmlns="http://www.iana.org/assignments" id="service-names-port-numbers">如果我把它改成
<registry>它可以工作,但是我不能更改XML,我必须更改XSLT。我能做些什么才能让它发挥作用?我只需要找到那些记录。
谢谢。
发布于 2014-02-08 17:56:06
XSLT和XPath是命名空间感知的。不幸的是,它们没有任何符号来设置路径的默认名称空间,因此您必须使用绑定到名称空间的显式前缀。
如果您不熟悉XML名称空间,请检查它们。他们很重要。
以您的具体示例为例,以下是SNTP文档开始的简化版本
<registry xmlns="http://www.iana.org/assignments" id="service-names-port-numbers">
<title>Service Name and Transport Protocol Port Number Registry</title>
<category>Service Names and Transport Protocol Port Numbers</category>
<updated>2014-02-06</updated>
<xref type="rfc" data="rfc6335"/>
<expert> ... names of experts ... </expert>
<note> ... usage notes ... </note>
<record>
<protocol>tcp</protocol>
<xref type="person" data="Jon_Postel"/>
<description>Reserved</description>
<number>0</number>
</record>
</registry>xmlns="http://www.iana.org/assignments"是默认的命名空间绑定。本文档中的所有元素都将位于该名称空间中,除非它们具有绑定到另一个名称空间的前缀,或者使用另一个xmlns=来更改它们及其子名称空间的默认值。
您的XPaths和Match表达式必须引用此命名空间,否则它们将无法工作。
变化
<xsl:for-each select="registry/record">至
<xsl:for-each select="assignments:registry/assignments:record"
xmlns:assignments="http://www.iana.org/assignments">(您可以使用比assignments更短的前缀;我只是想尽可能清楚地说明这一点。您还可以在XSLT文档中将前缀绑定得更高--通常是在<xsl:stylesheet>元素上--因此它可以在整个样式表中使用,而不仅仅是在这里)。
假设您的其余代码是正确的,这将有效。
另外:一般来说,<xsl:for-each>可能会被过度使用。通常,除非您确实需要在这里进行与样式表中其他任何地方不同的处理,否则您应该使用<xsl:apply-templates>,以便适用正常的模板匹配规则。否则,您将很难扩展和维护样式表。XSL是一种规则匹配的非过程语言;学习以这种方式使用它。
https://stackoverflow.com/questions/21649405
复制相似问题