1

我有一个看起来像这样的 XML 文件:

<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type="text/xsl" href="http://url/stylesheet.xsl"?>

<first xmlns="http://www.loc.gov/zing/srw/">
 <element1>And</element1>
 <e2>I said</e2>
 <e3>
  <e4>
   <mods version="3.0" 
   xmlns:bla="http://www.w3.org/1999/xlink" 
   xmlns:bla2="http://www.w3.org/2001/XMLSchema-instance" 
   xmlns="http://www.loc.gov/mods/v3" 
   xsi:schemaLocation="http://www.loc.gov/mods/v3">                                                        
    <f1>What about</f1>
    <f2>Breakfast at Tiffany's</f2>
   </mods>
  </e4>
 </e3>
</first>

另一方面,我有一个 XSL 文件来通过 XPath 获取元素:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:n="http://www.loc.gov/zing/srw/"
xmlns:o="http://www.loc.gov/mods/v3">

   <xsl:template match="/">
    <html><head></head><body>
     <xsl:value-of select="n:first/n:e2"/>
    </body></html>
   </xsl:template>
</xsl:stylesheet>

有了这个,我可以获取元素 e2 说 我说但是我无法访问元素 f4 说早餐在 Tiffany's 。XPath 是否假定元素 f4 有两个命名空间(默认命名空间 xmlns="http://www.loc.gov/zing/srw/" 首先在根元素中声明,元素mods 的命名空间 xmlns="http: //www.loc.gov/mods/v3") 还是 mods 命名空间 xmlns="http://www.loc.gov/mods/v3" 是 mods 元素的所有子元素的唯一命名空间?如果没有在我的 xsl 文件中声明前缀,我真的可以更轻松地访问元素 e2 吗?我刚开始使用 XML/XSL,所以我希望我的问题很清楚。

4

2 回答 2

1

以下 XPath 表达式应该可以工作:

n:first//o:f2

mods元素在o命名空间中,为其他命名空间定义前缀不会改变它。它的孩子继承命名空间。

于 2012-09-04T09:42:46.680 回答
1

只是为了扩展 choroba 的答案 - 因为mod重置默认值xmlns,您需要相应地调整您的命名空间别名,即完整的步行是:

 <xsl:value-of select="/n:first/n:e3/n:e4/o:mods/o:f2/text()"/>

如果您在 xslt 中省略了命名空间,则可以使用它local-name()来检查节点,而不管它们的命名空间如何(在这种情况下不建议这样做,因为如您所见,这会变得非常冗长)

 <xsl:value-of select="/*[local-name()='first']/*[local-name()='e3']
                       /*[local-name()='e4']/*[local-name()='mods']
                       /*[local-name()='f2']/text()"/>

exclude-result-prefixes="n o"您可以通过添加到您的输出文档 (html) 中删除别名xsl:stylesheet

我建议不要养成使用“//”的习惯,因为这会导致解析器对大型文档进行不必要的处理。

于 2012-09-04T11:09:11.327 回答