gpt4 book ai didi

xslt - 两阶段处理: Do not output empty tags from phase-1 XSLT 2. 0处理

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

我有一些复杂的XSLT 2.0转换。我试图找出是否有通用的方法来确保没有空标签输出。所以...从概念上讲,这是处理的最后阶段,该过程以递归方式删除所有空标签。我知道这可以通过单独的XSLT来完成,该XSLT除了过滤掉空标记外什么也不做,但是我需要将所有这些打包到一个容器中。

最佳答案

此XSLT 2.0转换说明了如何进行多遍(在这种情况下为2遍)处理:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="node()|@*" mode="#all">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="#current"/>
</xsl:copy>
</xsl:template>

<xsl:template match="/">
<xsl:variable name="vPass1">
<xsl:apply-templates/>
</xsl:variable>

<xsl:apply-templates select="$vPass1/*" mode="non-empty"/>
</xsl:template>

<xsl:template match="text()[xs:integer(.) mod 2 eq 0]"/>

<xsl:template match="*[not(node())]" mode="non-empty"/>
</xsl:stylesheet>

应用于此XML文档时的 :
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>

它在第一遍(在$vPass1变量中捕获)中创建了一个结果文档,其中所有内容(甚至是整数)的<num>元素都被剥夺了其内容,并且为空。然后,在以特定模式应用的第二遍中,将删除所有空元素。

转换的结果是:
<nums>
<num>01</num>
<num>03</num>
<num>05</num>
<num>07</num>
<num>09</num>
</nums>

请注意使用模式以及特殊模式#all#current的用法。

更新: OP现在希望在注释中“递归”删除“没有非空后代的所有节点”。

无需显式递归,可以更简单地实现这一点。只是改变:
 <xsl:template match="*[not(node())]" mode="non-empty"/>

至:
 <xsl:template match="*[not(descendant::text())]" mode="non-empty"/>

关于xslt - 两阶段处理: Do not output empty tags from phase-1 XSLT 2. 0处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3199560/

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