如何在xslt转换中保存集合中的文件名称?



我有一个在XSLT转换中处理的文件集合。集合看起来像这样(我不确定我是否真的可以在这里使用name属性):

<collection stable="true">
<doc href="3690096.xml" name="3690096"/>
<doc href="3690214.xml" name="3690214"/>
</collection>

在我的转换中,我在变量<xsl:variable name="my_collection" select="collection('collection.xml')"/>中使用集合,并在for-each循环中使用$my_collection来为每个xml文件创建html页面:

<xsl:for-each select="$my_collection">
<xsl:result-document href="{concat('item_', position(),'.html')}" method="html">
<xsl:call-template name="separate_page_for_file"/>
</xsl:result-document>
</xsl:for-each>

正如你在上面看到的,我使用position(),结果是item_1.htmlitem_2.html

我想要实现的是保留文件的原始ID。所以期望的结果是3690096.html3690214.html

一个扩展目标是让这些id也可用于其他东西,因为我有与这些id对应的图像(如3690214_1.jpeg, 3690214_1.jpeg等),我可以查找。

一般来说,我可以通过//doc/@name来寻址名称,但当我在$my_collection的for-each循环上下文中时,就不行了。

我会检查是否例如<xsl:result-document href="{base-uri() => replace('.xml$', '.html')}" method="html">工作。对我来说,是Saxon HE 11 Java和Saxon HE 12 Java。

Mike的建议是用e.g.

<xsl:for-each select="uri-collection('collection.xml')">
<xsl:result-document href="{replace(., '.xml$', '.html')}}" method="html">
<xsl:apply-templates select="doc(.)"/>
</xsl:result-document>
</xsl:for-each>

如果我没理解错的话。如果您有一个命名模板,期望集合中的每个文档作为上下文节点,则可以使用

<xsl:for-each select="uri-collection('collection.xml')">
<xsl:result-document href="{replace(., '.xml$', '.html')}}" method="html">
<xsl:for-each select="doc(.)">
<xsl:call-template name="separate_page_for_file"/>
</xsl:for-each>
</xsl:result-document>
</xsl:for-each>

你应该遍历$my_collection/collection/doc,然后你可以在循环中引用@href@name

这里有一点历史。在过去,Saxon的collection()函数总是返回具有document-uri()属性的文档,该属性可以有效地标识它们。但后来我们发现这并不满足不允许两个文件具有相同document-uri()的规则,所以我们对其进行了更改。您可以从https://saxonica.plan.io/issues/5640

开始跟踪一些历史。我认为在你的情况下最简单的解决方案可能是调用uri-collection()代替collection()。这为您提供了一组要使用的uri,您可以通过调用doc()来检索相应的文档。

或者,正如Martin建议的那样,如果您的集合实际上是由XML编目文件控制的,那么您可以单独处理所引用的文件。

最新更新