XSLT-参数为一系列节点

天鹅座夫人

我的目标是将多个文件的名称传递到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"/>

但是,它似乎正在将其读取为字符串值。当打印时,它看起来像这样(当然会失败):

'&lt;file-name&gt;XMLFile.XML&lt;/file-name&gt;'

我已经在命令行上尝试了各种引号组合(单/双),但都无济于事。还尝试添加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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何遍历一系列结构

来自分类Dev

Xpath xslt检索节点?

来自分类Dev

XSLT跳过节点

来自分类Dev

为javascript,jQuery中的一系列异步函数参数化变量回调

来自分类Dev

XPath:如何在节点集中选择一系列节点?

来自分类Dev

使用XSLT为子节点编号

来自分类Dev

将一系列功能应用于文本节点

来自分类Dev

兄弟节点的XSLT映射

来自分类Dev

使用XSLT重组节点

来自分类Dev

对一系列电话进行排序

来自分类Dev

设置节点以从一系列点随机产生并以逐渐更快的速度掉落

来自分类Dev

将SVG弧表示为一系列曲线

来自分类Dev

XSLT:参数化节点上的递归模板

来自分类Dev

如何使用FLWOR的XQuery返回一系列XML节点?

来自分类Dev

熊猫:从邻接矩阵到一系列节点列表

来自分类Dev

检测参数类型xslt

来自分类Dev

XSLT与节点不匹配

来自分类Dev

为JavaScript,jQuery中的一系列异步函数进行参数化变量回调

来自分类Dev

XSLT节点值比较

来自分类Dev

XSLT到达后代节点

来自分类Dev

将一系列功能应用于文本节点

来自分类Dev

为If / Then语句包括一系列单元格

来自分类Dev

对SAS宏参数使用一系列值

来自分类Dev

找到通过一系列节点的无环路径?

来自分类Dev

嵌套节点的xslt键

来自分类Dev

xPath:选择一系列兄弟节点,直到特定的兄弟节点

来自分类Dev

简化一系列 IF THEN

来自分类Dev

如何将一系列参数应用于 MATLAB 中的一系列函数?

来自分类Dev

在 Python 中将数组转换为一系列参数