我的目标是将多个文件的名称传递到 XSLT 中并使用 document($myFile) 处理这些文件。我正在尝试使用 saxon 引擎在命令行上传递参数,但它不断抛出错误。
我知道我可以写出一个 list 文件,处理它,然后在完成后将其删除。但这似乎是很多额外的工作,可能会进一步减慢速度。
当参数像这样硬编码时 XSLT 工作...
<xsl:param name="PnewArticles" as="element()*">
<file-name>XMLFile.XML</file-name>
<file-name>XMLFile2.XML</file-name>
</xsl:param>
从命令行分配看起来像这样:
XSLT -s:Source.XML -o:outfileTest.xml -xsl:"test.xsl" newArticles='<file-name>XMLFile.XML</file-name>'
<!-- xslt param changed to this: -->
<xsl:param name="newArticles"/>
但是,它似乎是将其作为字符串值读取。打印出来时看起来像这样(当然,失败了):
'<file-name>XMLFile.XML</file-name>'
我在命令行上尝试了各种引号组合(单引号/双引号),但无济于事。还尝试像硬编码示例一样添加 as="element()*" - 但随后它会强烈提示......
XPTY0004: Required item type of value of variable $newArticles is node(); suplied value has item type xs:untypedAtomic
有什么想法吗?看起来这应该是可能的。
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:oasis="//OASIS//DTD XML Exchange Table Model 19990315//EN"
xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
exclude-result-prefixes="mml oasis dc content xsi">
<xsl:output method="xml" encoding="utf8"/>
<xsl:param name="newArticles"/>
<!-- When these are used they work -- the extra letter in front is just to silence -->
<xsl:param name="PnewArticles" as="element()*">
<file-name>XMLFile.XML</file-name>
</xsl:param>
<xsl:variable name="VnewArticles" as="element()*">
<file-name>XMLFile.XML</file-name>
</xsl:variable>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="skipDays">
<xsl:copy-of select="."/>
<myParam>
<xsl:value-of select="$newArticles"/>
</myParam>
<xsl:apply-templates select="document($newArticles)" mode="addArticle"/>
</xsl:template>
<xsl:template match="front" mode="addArticle">
<item>
<xsl:text>NEW XML, Vol. </xsl:text>
<xsl:value-of select="volume"/>
<xsl:text>, No. </xsl:text>
<xsl:value-of select="issue"/>
</item>
</xsl:template>
<xsl:template match="body" mode="addArticle"/>
</xsl:stylesheet>
源文件
<?xml version="1.0"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<language>en-us</language>
<skipDays>
<day>Saturday</day>
<day>Sunday</day>
</skipDays>
</channel>
</rss>
XML文件
<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE article>
<article xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" dtd-version="2.2" xml:lang="EN" article-type="abstract">
<front>
<volume>17</volume>
<issue>1</issue>
</front>
<body>
<sec>
<title>This is my Title</title>
<p>This is a Paragraph</p>
</sec>
</body>
</article>
最佳答案
尝试了 5 分钟,我只能通过将 XML 放在一个单独的文件中,然后在参数中引用该文件(通过在命令行的参数名称中添加 + ).
注意:XML 必须格式正确,因此如果您需要多个 file-name 元素,您必须将它们包装在根元素中,例如:
<param>
<file-name>XMLFile.XML</file-name>
<file-name>other</file-name>
</param>
(我引用了 http://www.saxonica.com/documentation/using-xsl/commandline.html )
例子:
XSLT 2.0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="newArticles"/>
<xsl:template match="/*">
<test>
<xsl:copy-of select="$newArticles"/>
</test>
</xsl:template>
</xsl:stylesheet>
命令行 (Windows)
java -cp "C:\apps\saxon\saxon9he.jar" net.sf.saxon.Transform ^
-s:"so_test.xsl" ^
-xsl:"so_test.xsl" ^
+newArticles="newArticlesParam.xml"
newArticlesParam.xml
<file-name>XMLFile.XML</file-name>
输出
<test>
<file-name>XMLFile.XML</file-name>
</test>
关于xml - XSLT - 作为一系列节点的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23748044/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use