提问人:lilaaffe 提问时间:2/18/2021 更新时间:2/18/2021 访问量:122
使用 XSLT 和 XSLT 1.0 从 XML 输出文本 (MSXML 6)
Text output from XML with XSLT with XSLT 1.0 (MSXML 6)
问:
我有一个无法用 xslt 1.0 解决的问题。 XSLT 2.0 的解决方案已经给出并且运行良好(请参阅下文)。
对于按STRAT_ZONE分组的每个图层,需要DEPTHFROM_ZONE中的最小值和最大值DEPTHTO_ZONE。
按STRAT_ZONE分组似乎不是一个选项,因为该属性可以重复自身。 逐行检查是一个想法。
有没有人有任何提示,如何尝试达到预期的目标?
数据块:
<ZONES>
<ZONE STRAT_ZONE="Flysand unchained" DEPTHFROM_ZONE="0.00" DEPTHTO_ZONE="0.30" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Flysand unchained" DEPTHFROM_ZONE="0.30" DEPTHTO_ZONE="1.10" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Flysand unchained" DEPTHFROM_ZONE="1.10" DEPTHTO_ZONE="1.40" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Flysand unchained" DEPTHFROM_ZONE="1.40" DEPTHTO_ZONE="1.70" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="1.70" DEPTHTO_ZONE="1.80" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="1.80" DEPTHTO_ZONE="2.20" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="2.20" DEPTHTO_ZONE="2.60" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Flysand unchained" DEPTHFROM_ZONE="2.60" DEPTHTO_ZONE="2.80" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Flysand unchained" DEPTHFROM_ZONE="2.80" DEPTHTO_ZONE="2.90" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="2.90" DEPTHTO_ZONE="3.10" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="3.10" DEPTHTO_ZONE="3.40" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="3.40" DEPTHTO_ZONE="3.70" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="3.70" DEPTHTO_ZONE="4.50" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Drifting sand" DEPTHFROM_ZONE="4.50" DEPTHTO_ZONE="4.90" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Vulcanic" DEPTHFROM_ZONE="4.90" DEPTHTO_ZONE="6.00" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Vulcanic" DEPTHFROM_ZONE="6.00" DEPTHTO_ZONE="6.20" INDEX_ZONE="-1"/>
<ZONE STRAT_ZONE="Vulcanic" DEPTHFROM_ZONE="6.20" DEPTHTO_ZONE="6.30" INDEX_ZONE="-1"/>
</ZONES>
期望输出:
ZONE "Flysand unchained" 0.00 1.70 -1
ZONE "Drifting sand" 1.70 2.60 -1
ZONE "Flysand unchained" 2.60 2.90 -1
ZONE "Drifting sand" 2.90 4.90 -1
ZONE "Vulcanic" 4.90 6.30 -1
版本 2.0 的解决方案如下所示(感谢 Martin Honnen):
<xsl:template match="ZONES">
<xsl:for-each-group select="ZONE" group-adjacent="@STRAT_ZONE">
<xsl:value-of
select="'ZONE', current-grouping-key(), min(current-group()/@DEPTHFROM_ZONE), max(current-group()/@DEPTHTO_ZONE), @INDEX_ZONE"/>
<xsl:text> </xsl:text>
</xsl:for-each-group>
</xsl:template>
但是如何使用 MSXML 6 处理器在 XSLT 1.0 中实现相同的结果呢?
非常感谢您的帮助。
答:
1赞
michael.hor257k
2/18/2021
#1
在 XSLT 1.0 中可实现多种方法。我相信在您的情况下使用最方便的是:group-adjacent
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:key name="adj" match="ZONE" use="generate-id(preceding-sibling::ZONE[not(@STRAT_ZONE = current()/@STRAT_ZONE)][1])" />
<xsl:template match="/ZONES">
<xsl:for-each select="ZONE[generate-id() = generate-id(key('adj', generate-id(preceding-sibling::ZONE[not(@STRAT_ZONE = current()/@STRAT_ZONE)][1]))[1])]">
<xsl:variable name="current-group" select="key('adj', generate-id(preceding-sibling::ZONE[not(@STRAT_ZONE = current()/@STRAT_ZONE)][1]))" />
<xsl:text>ZONE "</xsl:text>
<xsl:value-of select="@STRAT_ZONE"/>
<xsl:text>" </xsl:text>
<xsl:for-each select="$current-group">
<xsl:sort select="@DEPTHFROM_ZONE" data-type="number" order="ascending"/>
<xsl:if test="position() = 1 ">
<xsl:value-of select="@DEPTHFROM_ZONE"/>
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
<xsl:for-each select="$current-group">
<xsl:sort select="@DEPTHTO_ZONE" data-type="number" order="descending"/>
<xsl:if test="position() = 1 ">
<xsl:value-of select="@DEPTHTO_ZONE"/>
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
<xsl:value-of select="@INDEX_ZONE"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
这会按值与当前节点不同的前一个同级节点对节点进行分组 - 这对于具有相同值的所有相邻节点都是通用的。id
id
评论
0赞
lilaaffe
2/18/2021
这很好用:)非常感谢
评论