在 XSLT 中匹配具有名称空间前缀的元素

Posted

技术标签:

【中文标题】在 XSLT 中匹配具有名称空间前缀的元素【英文标题】:Matching elements with namespace prefix in XSLT 【发布时间】:2011-07-03 07:28:20 【问题描述】:

这是我的 xml 输入。

<package version="2.0" unique-identifier="uuid_id"
         xmlns="http://www.idpf.org/2007/opf">
  <metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:opf="http://www.idpf.org/2007/opf"
            xmlns:dcterms="http://purl.org/dc/terms/"
            xmlns:calibre="http://calibre.kovidgoyal.net/2009/metadata"
            xmlns:dc="http://purl.org/dc/elements/1.1/">
    <meta name="calibre:series_index" content="1"/>
    <dc:language>UND</dc:language>
    <dc:creator opf:file-as="Marquez, Gabriel Garcia" 
                opf:role="aut"
               >Gabriel Garcia Marquez</dc:creator>
    <meta name="calibre:timestamp" content="2010-07-14T21:35:15.266000+00:00"/>
    <dc:title>Cem Anos de Solidão</dc:title>
    <meta name="cover" content="cover"/>
    <dc:date>2010-07-14T21:35:15.266000+00:00</dc:date>
    <dc:contributor opf:role="bkp"
                   >calibre (0.7.4) [http://calibre-ebook.com]</dc:contributor>
    <dc:identifier id="uuid_id" opf:scheme="uuid"
                  >7e11dc8b-55cb-4411-8f30-df974fbcf58a</dc:identifier>
  </metadata>
  <manifest>
</package>

我的 xslt 开始像..

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xhtml="http://www.w3.org/1999/xhtml">

<xsl:template match="package">
     <xsl:message>Entering package</xsl:message>
</xsl:template>

我正在使用XSLT 1.0,但模板包未匹配。当我删除包节点中的命名空间xmlns="http://www.idpf.org/2007/opf" 时,模板会匹配。如何在不删除命名空间的情况下使我的模板匹配。

请帮助我。提前致谢。

【问题讨论】:

xslt script doesn't work when a namespace is declared in the root node的可能重复 【参考方案1】:

在样式表中添加命名空间。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  xmlns:opf="http://www.idpf.org/2007/opf">

<xsl:template match="opf:package">
     <xsl:message>Entering package</xsl:message>
</xsl:template>

【讨论】:

顺便说一句,这是唯一的方法吗?您是否必须在匹配本身中“硬编码”“xxx:”前缀,或者是否有其他选项可以“全局”定义仅涵盖特定命名空间的模板?【参考方案2】:

XSLT 理解在输入 XML 中定义的命名空间 QName。

除了上面的答案,我们可以给我们的 xsl 命名空间起任何名字。

输入 xml 定义为 xmlns:dc="http://purl.org/dc/elements/1.1/" 和元素被定义为 dc 前缀

您可以在下面定义样式表:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xhtml="http://www.w3.org/1999/xhtml"
     xmlns:purl="http://purl.org/dc/elements/1.1/"
     xmlns:idpf="http://www.idpf.org/2007/opf">
<xsl:template match="idpf:package/purl:language">
<xsl:message>Entering package. Selected Language.</xsl:message>
</xsl:template>

【讨论】:

【参考方案3】:

试试这个忽略命名空间:

<xsl:template match="*[local-name()='package']">
    <xsl:message>Entering package</xsl:message>
</xsl:template>

【讨论】:

很好地解决了人们在谷歌上搜索如何忽略命名空间的问题,谢谢。 这就是我要找的。​​span>

以上是关于在 XSLT 中匹配具有名称空间前缀的元素的主要内容,如果未能解决你的问题,请参考以下文章

删除 XSLT 映射生成的元素的名称空间前缀

如何使用 XSLT 为所有元素和属性添加名称空间和前缀?

如何使用 XSLT 替换命名空间中的元素?

xsd:any 元素的命名空间前缀并使用 XSLT 添加命名空间前缀

XSLT:如何删除同义名称空间

XML 元素名称中包含的 XSLT 命名空间 URI