gpt4 book ai didi

xslt - 组合多个处理相同节点的 XSLT 1.0 传递的最佳方法

转载 作者:行者123 更新时间:2023-12-02 02:24:02 25 4
gpt4 key购买 nike

我正在做一些非常复杂的 XSLT 1.0 转换(目前使用 8 个 XSLT 传递)。我想合并这 8 个 channel 而不将它们合并到一个文件中(这太复杂了)。我的解决方案是使用 xsl:includeexsl:node-set 合并 channel 并将临时结果存储在变量中。

但我有一个问题:我的转换通过复制大部分节点并仅修改某些方面。因此,我需要在每次传递中处理相同的节点,但使用不同 xsl:template!但是我该怎么做呢?如何判断在第一次通过后我想应用来自其他 XSLT 样式表的模板?

我目前正在做的非常简单的例子(2 个 XSLT 传递):

来源:

<h>something here</h>

XSLT 第 1 遍之后:

<h someattribute="1">something here</h>

XSLT 第 2 轮之后:

<h someattribute="1" somemoreattribute="2">something here, and even more</h>

我目前的做法是调用 XSLT 处理器两次并将结果临时保存在磁盘上:

xsltproc stylesheet1.xsl input.xml >temp.xml
xsltproc stylesheet2.xsl temp.xml >finalresult.xml

最佳答案

一个可能的解决方案是更改每个样式表以使用不同的 mode .然后,您可以将它们全部导入到您的主样式表中,并通过依次使用每种模式应用模板来进行多次传递:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl"
version="1.0">

<xsl:import href="stylesheet1.xsl"/> <!-- assuming mode="stylesheet1" -->
<xsl:import href="stylesheet2.xsl"/> <!-- assuming mode="stylesheet2" -->
<xsl:import href="stylesheet3.xsl"/> <!-- assuming mode="stylesheet3" -->

<xsl:template match="/">
<xsl:variable name="temp1">
<xsl:apply-templates select="." mode="stylesheet1"/>
</xsl:variable>
<xsl:variable name="temp2">
<xsl:apply-templates mode="stylesheet2" select="exsl:node-set($temp1)"/>
</xsl:variable>
<xsl:apply-templates mode="stylesheet3" select="exsl:node-set($temp2)"/>
</xsl:template>

</xsl:stylesheet>

缺点是您需要修改原始样式表,为每个 xsl:templatexsl:apply-templates 添加适当的 mode 属性>。您仍然可以通过在每个样式表中添加一个像这样的额外模板来使样式表也独立工作:

<xsl:template match="/">
<xsl:apply-templates select="." mode="stylesheet1"/>
</xsl:template>

关于xslt - 组合多个处理相同节点的 XSLT 1.0 传递的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6773901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com