jjzjj

xml - XSL 和 XPATH 问题匹配

coder 2024-07-05 原文

我有这个 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cd.xsl"?>
    <produce>
        <item>apple<x>kk</x><y>jj</y></item>
        <item>banana<x>aaa</x></item>
        <item>pepper<x>qqq</x></item>
    </produce>

和这个 XLS 文件:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">
  <xsl:output method="html"/>

  <xsl:template match="/">
     <html>
    <body>
    <ul>
    <li><xsl:value-of select="node()"/></li>
    </ul>
    </body>
    </html>
  </xsl:template>
  </xsl:stylesheet>

我不明白“/”和“/*”匹配之间的区别,因此我正在做各种测试,例如像上面的那些我得到这个:

type="text/xsl" href="cd.xsl"

我不明白为什么。(我期望 produce 标签)。

但是如果我使用这个 XLS 文件:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    version="1.0">
      <xsl:output method="html"/>

      <xsl:template match="/*">
         <html>
        <body>
        <ul>
        <li><xsl:value-of select="node()"/></li>
        </ul>
        </body>
        </html>
      </xsl:template>
      </xsl:stylesheet>

我得到空白页(只有标签 li 的黑点​​)。 你能解释一下这些区别吗?

最佳答案

If you want to understand what an XSL transformation does, use a tool that will show you the actual resulting code (e.g. xsltransform.net) - not a browser. – michael.hor257k

我非常同意这一点,使用例如http://xsltransform.net/ .


TL;DR: / 是文档节点,/* 是输入文档的最外层元素

你从第一个样式表得到的输出是

<html>
   <body>
      <ul>
         <li>type="text/xsl" href="cd.xsl"</li>
      </ul>
   </body>
</html>

我明白为什么这会让您感到惊讶。让我们看一下 XSLT 代码,您在其中匹配文档节点:

<xsl:template match="/">

在此模板中,您对输入文档的唯一引用是

<xsl:value-of select="node()"/>

它选择作为文档节点 (/) 子节点的第一个节点的值。实际上,node() 是一组节点,但在 XSLT 1.0 中,在类似这些的上下文中,仅使用此类集合中的第一项。

那么,什么是节点?在 XML 文档模型(例如 XDM)中,有许多不同类型的节点,其中包括:元素节点、属性节点、处理指令。现在看看您的输入文档:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cd.xsl"?>
<produce>
    <item>apple<x>kk</x><y>jj</y></item>
    <item>banana<x>aaa</x></item>
    <item>pepper<x>qqq</x></item>
</produce>

第一行是不属于文档一部分的 XML 声明。第二行是一条处理指令,告诉浏览器到哪里寻找 XSLT 样式表。处理指令文档的一部分。

此处理指令是文档节点的第一个子节点 - 这就是为什么您将其内容作为结果的原因

<xsl:value-of select="node()"/>

从所有这些可以看出,如果您从输入文档中删除处理指令,输出将如下所示

<html>
   <body>
      <ul>
         <li>
            applekkjj
                    bananaaaa
                    pepperqqq

         </li>
      </ul>
   </body>
</html>

因为现在,produce元素是/的第一个子节点。您看到的结果是 produce 元素的字符串值


另一方面,如果模板匹配/*,那么输出不是空页面,而是

<html>
   <body>
      <ul>
         <li>

         </li>
      </ul>
   </body>
</html>

/* 表示 XML 文档的最外层元素,在本例中为 produce。现在,produce 元素是 xsl:value-ofcontext:

<xsl:value-of select="node()"/>

同样,这将选择 produce 元素的第一个子节点 - 这是一个仅包含空格的 文本节点

关于xml - XSL 和 XPATH 问题匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34856580/

有关xml - XSL 和 XPATH 问题匹配的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  4. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  5. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  6. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  7. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  8. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  9. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  10. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

随机推荐