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

发布于 2024-10-19 03:12:56 字数 1832 浏览 3 评论 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>

我的 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" 时,模板会匹配。如何在不删除命名空间的情况下使我的模板匹配。

请帮我。提前致谢。

This is my xml input.

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

and my xslt starts like..

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

I am using XSLT 1.0 and the template package is not getting matched. When I remove the namespace xmlns="http://www.idpf.org/2007/opf" in package node, the template gets matched. How I can make my template to match without removing the namespaces.

Please help me. Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

您的好友蓝忘机已上羡 2024-10-26 03:12:56

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

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

Add the namespaces in your stylesheet.

<?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>
云淡风轻 2024-10-26 03:12:56

尝试忽略命名空间:

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

Try this to ignore the namespace:

<xsl:template match="*[local-name()='package']">
    <xsl:message>Entering package</xsl:message>
</xsl:template>
等风也等你 2024-10-26 03:12:56

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>

XSLT understands the namespaces QNames which are defined in input XML.

In addition to the above answer we can give any name to our xsl namespace.

Input xml has definition as xmlns:dc="http://purl.org/dc/elements/1.1/"
and elements are defines as dc prefix

You can define a stylesheet below :

<?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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文