微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XSL值似乎没有从xml获得值

我有一个xml文件,其中包含以下内容

<?xml version="1.0"?>
<mods xmlns="http://www.loc.gov/mods/v3" xmlns:mods="http://www.loc.gov/mods/v3"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xlink="http://www.w3.org/1999/xlink">
   <titleInfo><title>A-Title-01</title></titleInfo>
</mods>

一个XSL文件

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <h2>Description</h2>
    <p>Hello</p>
    <p><xsl:value-of select="titleInfo/title"/></p>
</xsl:template>
</xsl:stylesheet>

我的问题是我没有在xHTML中获得标题值.我只能看到

描述

你好

但是,如果我从xml中删除认命名空间,如下所示:

<?xml version="1.0"?>
<mods xmlns:mods="http://www.loc.gov/mods/v3"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xlink="http://www.w3.org/1999/xlink">
   <titleInfo><title>A-Title-01</title></titleInfo>
</mods>

并将样式表的匹配更改为< xsl:template match =“/ mods”>我可以看到标题值.

但我无法从xml中删除认命名空间,因为xml是由表单生成的,如果删除认命名空间,它将无法工作.我甚至不知道如何绕过这个或者我做错了什么.请帮忙.

提前致谢.

解决方法

/的模板匹配不是从文档元素开始,而是“根节点” – 它位于任何内容之前.文档中的第一个节点()不必是文档元素,它可以是注释或处理指令,并且可以是“根节点”的子节点.

因此,如果您想匹配文档元素mods,并且您不想担心名称空间,则模板匹配可能是/ *.然后您的XPath选择元素相对于文档元素将起作用.

但是,titleInfo和title元素继承document元素的名称空间.所以,如果你想匹配它们,你有几个选择:

>声明命名空间并为其指定一个前缀,以便您可以在XPath中使用它
>通常在元素上匹配谓词过滤器以匹配local-name()和namespace-uri() – 但是如果您知道URI,则更容易声明它并使用选项#1中的前缀.
>通常在元素上匹配谓词过滤器以匹配local-name().不是干净/适当,但可能会起作用.
>对每个步骤的元素进行一般匹配,并依赖此简单文档的结构来查找您要查找的元素

选项1:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:m="http://www.loc.gov/mods/v3">
        <xsl:template match="/m:mods">
            <h2>Description</h2>
            <p>Hello</p>
            <p><xsl:value-of select="m:titleInfo/m:title"/></p>
        </xsl:template>
</xsl:stylesheet>

选项#2:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/*[local-name()='mods' and namespace-uri()='http://www.loc.gov/mods/v3']">
            <h2>Description</h2>
            <p>Hello</p>
        <p><xsl:value-of select="*[local-name()='titleInfo' 
                                   and namespace-uri()='http://www.loc.gov/mods/v3']/*[local-name()='title' and namespace-uri()='http://www.loc.gov/mods/v3']"/></p>
        </xsl:template>
</xsl:stylesheet>

选项#3:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/*[local-name()='mods']">
            <h2>Description</h2>
            <p>Hello</p>
        <p><xsl:value-of select="*[local-name()='titleInfo']/*[local-name()='title']"/></p>
        </xsl:template>
</xsl:stylesheet>

选项#4:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/*">
        <h2>Description</h2>
        <p>Hello</p>
        <p><xsl:value-of select="*/*"/></p>
    </xsl:template>
</xsl:stylesheet>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。