gpt4 book ai didi

xslt - 如何通过第二个(未命名的)模板重新处理元素?

转载 作者:行者123 更新时间:2023-12-03 17:00:28 25 4
gpt4 key购买 nike

我已经将某些语句分开应用于单独模板中的特定元素。
该元素在一个模板中处理,该模板包含语句<xsl:apply-templates/>
有没有办法让元素在第一个模板中刚刚处理,然后在第二个(未命名)模板中重新处理?
当然,我知道我可以使用命名模板并从第一个模板中调用它,但是我只是想知道是否可以这样做。
为了给您一些有用的东西,这是我正在研究的东西的简化模型。
我有一个包含表的html输入文件:

<?xml version="1.0" encoding="UTF-8"?>
<table>
<tbody>
<tr>
<td>content</td>
<td></td>
<td/>
</tr>
</tbody>
</table>


我希望在每个 block元素内都有一个 td元素,如果有一个元素,则将 td字符串内容括起来;如果 td元素本身为空,则该元素为空。我尝试了以下操作(再次注意,我不想在第一个模板中进行重大更改!):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="*">
<xsl:copy>
<xsl:attribute name="test"><xsl:value-of select="local-name()"/></xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>

<xsl:template match="td/text()">
<block><xsl:value-of select="."/></block>
</xsl:template>
</xsl:stylesheet>


其中添加的属性只是第一个模板中正在完成的工作的建模示例。

作为输出

<?xml version="1.0" encoding="UTF-8"?>
<table test="table">
<tbody test="tbody">
<tr test="tr">
<td test="td">
<block>content</block>
</td>
<td test="td"/>
<td test="td"/>
</tr>
</tbody>
</table>


我希望得到

<?xml version="1.0" encoding="UTF-8"?>
<table test="table">
<tbody test="tbody">
<tr test="tr">
<td test="td">
<block>content</block>
</td>
<td test="td">
<block/>
</td>
<td test="td">
<block/>
</td>
</tr>
</tbody>
</table>


很明显为什么它不起作用:空的 td元素中没有文本节点,因此第二个模板的Xpath表达式不匹配这些文本节点。
因此,我开始考虑通过第二个模板重新处理 td元素本身的方法。当然,我不能使用 match="td[some condition]",因为那样将不会应用第一个模板。
而且我也不能使用 match= "self::td",因为模板匹配属性中不允许使用 self轴(当然,在某些情况下除外),或者,它需要一个当前节点,而该节点在您开始匹配时还没有。
那么第二个模板是否有合适的Xpath表达式可以满足我的需求?
还是有另一种简单的方法来触发刚刚在一个模板中处理的元素的另一个(未命名)模板?
注意:我不是在第二个模板上寻找简单的更新,而是在其中添加属性。我希望第一个模板添加属性,第二个模板添加块元素。

最佳答案

尝试添加另一个“修改过的”模板。您应该可以在该模式下使用xsl:apply-templates

示例xsl:template:

<xsl:template match="td" mode="test">
<bar>test</bar>
</xsl:template>


示例xsl:apply-templates:

<xsl:template match="td">
<foo><xsl:apply-templates select="ancestor-or-self::td" mode="test"/></foo>
</xsl:template>

关于xslt - 如何通过第二个(未命名的)模板重新处理元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10248501/

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