我有这个 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-of 的 context:
<xsl:value-of select="node()"/>
同样,这将选择 produce 元素的第一个子节点 - 这是一个仅包含空格的 文本节点。
关于xml - XSL 和 XPATH 问题匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34856580/
我正在学习如何使用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
我想为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
尝试通过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
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如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
如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
我的最终目标是安装当前版本的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
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub