我的目标是将多个文件的名称传递到XSLT中,并使用来处理文件document($myFile)
。我正在尝试使用saxon引擎在命令行上传递参数,并且该参数会不断抛出错误。
我知道我可以写出清单文件,进行处理,然后在完成后将其删除。但这似乎是很多额外的工作,有可能使事情变得更慢。
当参数像这样硬编码时,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>
如果您确实想在命令行上提供词法XML,则必须使用对Saxon:parse()或XPath 3.0函数parse-xml()的调用在样式表中对其进行解析,这两者都需要Saxon-PE或更高。但是对我来说,这似乎很奇怪。
我以为最明显的解决方案是提供一个包含文件名列表的字符串值参数,并用冒号或分号等分隔,然后在样式表中使用tokenize()分离出各个文件名,然后可以传递给document()。实际上document()接受URI列表,因此您可以直接这样做document(tokenize($param, ';'))
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句