获取以下元素中大括号之间的文本,并使用xslt组合文本



我想获取大括号之间的文本,并将孔文本组合到一个元素中

我的XML输入位于一个td,r和t元素中,其中包含需要在一个t元素中与一个td:中组合的文本

<topic>
<body>
<table>
<tr><td><p id="1"><pPr><pstyle class="normal"/></pPr>
<r><t>{</t></r>
<r><t>Ram</t></r>
<r><t>Ramt}</t></r>
</p></td></tr>
<tr><td><p id="2"><pPr><pstyle class="normal"/></pPr>
<r><t>{Red</t></r>
<r><t>Sham</t></r>
<r><t>}</t></r>
</p></td></tr>
<tr><td><p id="3"><pPr><pstyle class="normal"/></pPr>
<r><t>{Red</t></r>
<r><t>}</t></r>
</p></td></tr>
<tr><td><p id="4"><pPr><pstyle class="normal"/></pPr>
<r><t>{Damn}</t></r>
</p></td></tr>
</table>
</body>
</topic>

我使用XSLT来获取花括号文本,检查花括号的开始和结束,然后应用模板:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="r/t">
<xsl:choose>
<xsl:when test="starts-with(t, '{') and ends-with(t, '}')">
<r><t><xsl:apply-templates/></t></r>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:transform>

我得到的输出只有r元素值,没有组合,t元素也不存在

<topic>
<body>
<table>
<tr><td><p id="1"><pPr>
<pstyle class="normal"></pstyle>
</pPr>
<r>{</r>
<r>Ram</r>
<r>Ramt}</r>
</p></td></tr>
<tr><td><p id="2"><pPr><pstyle class="normal"></pstyle></pPr>
<r>{Red</r>
<r>Sham</r>
<r>}</r>
</p></td></tr>
<tr><td><p id="3"><pPr><pstyle class="normal"></pstyle></pPr>
<r>{Red</r>
<r>}</r>
</p></td></tr>
<tr><td><p id="4"><pPr><pstyle class="normal"></pstyle></pPr>
<r>{Damn}</r>
</p></td></tr>
</table>
</body>
</topic>

在r元素内部的元素文本中组合所需的输出:

<topic>
<body>
<table>
<tr><td><p id="1"><pPr><pstyle class="normal"/></pPr>
<r><t>{RamRamt}</t></r>
</p></td></tr>
<tr><td><p id="2"><pPr><pstyle class="normal"/></pPr>
<r><t>{RedSham}</t></r>
</p></td></tr>
<tr><td><p id="3"><pPr><pstyle class="normal"/></pPr>
<r><t>{Red}</t></r>
</p></td></tr>
<tr><td><p id="4"><pPr><pstyle class="normal"/></pPr>
<r><t>{Damn}</t></r>
</p></td></tr>
</table>
</body>
</topic>

请告知

以下是使用for-each-group:的尝试

<xsl:template match="p[r/t]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each-group select="*" group-adjacent="boolean(self::r[t])">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<xsl:for-each-group select="current-group()" group-starting-with="r[t[starts-with(., '{')]]">
<xsl:for-each-group select="current-group()" group-ending-with="r[t[ends-with(., '}')]]">
<r><t><xsl:apply-templates select="current-group()/t/text()"/></t></r>
</xsl:for-each-group>
</xsl:for-each-group>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>

假设身份转换被设置为基本转换步骤,例如XSLT3中的<xsl:mode on-no-match="shallow-copy"/>(https://xsltfiddle.liberty-development.net/94AbWB4)或者用一个等效的模板拼写出来。

以上内容不会涵盖所有边缘情况,但您还没有真正说明是否可以有其他内容;应该可以调整分组条件和/或内部CCD_ 3测试以改进代码以处理更多可变内容。

最新更新