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

vig*_*esh 9 xslt xslt-1.0

这是我的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>
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

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

请帮我.提前致谢.

Ign*_*ams 24

在样式表中添加名称空间.

<?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>
Run Code Online (Sandbox Code Playgroud)

  • 这是顺便说一下的唯一方法吗?你是否必须在匹配中"硬编码"'xxx:'前缀,还是有另一种选择来"全局"定义仅覆盖特定命名空间的模板? (6认同)

小智 6

尝试执行以下操作以忽略名称空间:

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

  • 对于谷歌搜索如何忽略命名空间的人来说,这是一个很好的修复,谢谢。 (3认同)