xml - 在 XSLT 2 中使用 for-each-group 和 group-adjacent 进行分组和包装
问题描述
显然,我对 XSLT 2 中的分组如何工作的理解还不够好。我确信xsl:for-each-group
使用group-adjacent
as 属性的方法是正确的。但是,我没有得到想要的结果。
我想在我的 XML 源中对几个相邻的元素进行分组。元素通过后代元素的属性值来标识。我需要用一个新元素(例如p div="lernz"
)包装它们。有时这些元素显示为邻居,有时则不是。
我的样式表没有得到正确的结果。有时我认为应该是组的第一项之前的元素是匹配的。但是到目前为止,在我的结果中,我认为是一个组的每一个项目都被包装了。错误在哪里?任何帮助是极大的赞赏。
XML 输入
<wx:sect>
<w:p>
<w:pPr w:val = 'Lern'/>
</w:p>
<w:p>
<w:pPr w:val = 'Lern'/>
</w:p>
<w:p>
<w:pPr w:val = 'Merk'/>
</w:p>
<w:p>
<w:pPr w:val = 'Lern'/>
</w:p>
<w:p>
<w:pPr w:val = 'Merk'/>
</w:p>
</w:sect>
期望的输出
<wx:sect>
<p div="wrapper-lernz">
<w:p>
<w:pPr w:val = 'Lern'/>
</w:p>
<w:p>
<w:pPr w:val = 'Lern'/>
</w:p>
</p>
<w:p>
<w:pPr w:val = 'Merk'/>
</w:p>
<p div="wrapper-lernz">
<w:p>
<w:pPr w:val = 'Lern'/>
</w:p>
</p>
<w:p>
<w:pPr w:val = 'Merk'/>
</w:p>
</w:sect>
我的样式表(部分)
<xsl:template match="//w:p[w:pPr[@w:val]]">
<xsl:for-each-group select="current()" group-adjacent="//@w:val = 'Lern">
<p div="wrapper-lernz">
<xsl:value-of select="current-group()"/>
</p>
</xsl:for-each-group>
</xsl:template>
解决方案
您的模板匹配w:p
,但如果您想对相邻元素进行分组,您应该匹配父w:sect
标签。通过这样做xsl:for-each-group select="current()"
,您正在尝试对单个元素进行分组。
要处理仅将“lern”元素放在容器标签中,您应该 group-adjacent= 在“w:val”值上,然后xsl:choose
决定是否添加父标签。
试试这个模板:
<xsl:template match="//w:sect[w:p[w:pPr/@w:val]]">
<xsl:copy>
<xsl:for-each-group select="w:p" group-adjacent="w:pPr/@w:val">
<xsl:choose>
<xsl:when test="current-grouping-key() = 'Lern'">
<p div="wrapper-lernz">
<xsl:copy-of select="current-group()"/>
</p>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
(请注意,它也不仅仅返回节点的文本值,而xsl:copy-of
不是节点本身)xsl:value-of
xsl:value-of
推荐阅读
- python - 如何在 KivyMD 中编写可重复使用的按钮?
- python - 熊猫更新未反映在 jupyter 笔记本中
- java - 错误 - 解释器不是抽象的,并且不会覆盖抽象方法
- c# - Azure KeyVault:如何创建 clientId 和 clientSecret?
- oop - 这是否被视为程序编程(或贫血模式)?
- java - JPA 在每次迭代后开始消耗越来越多的内存
- android - Android Drawable XML 背景形状
- java - 更改允许在 Android 设备中使用的最大 Ram 一个应用程序的数量
- flutter - 按下按钮时播放 Flare 动画
- linux - Linux Ubuntu 中的 Bash shell 不启动可执行文件