XSLT:将相同的标签合并为一个并进行编辑

XSLT: Combine same tags into one and edit it

我在 <p> 标签中有 <r> 个标签。每个 <r>-Tag 都可以有属性,并且有一个 <t>-Tag。 我需要将这些 t-tags 合并为一个,但在这样做之前进行编辑。

示例输入:

<document>
<body>
    <p>
        <r>
            <rPr>
                <rStyle val="TabelleSpaltentitelZchn"/>
            </rPr>
            <t>Erster Teil</t>
        </r>
        <r>
            <t space="preserve"> Zweiter Teil</t>
        </r>
    </p>
</body>
</document>

期望的结果:

<?xml version="1.0" encoding="UTF-8"?>
<document>
 <body>
  <p>
     <r>
        <t><span class="TabelleSpaltentitelZchn">Erster Teil</span> Zweiter Teil</t>
     </r>
  </p>
 </body>
</document>

所以在每个包含 rStyle-Information 的 <r>-Tag 处,我需要将 <t>-Value 包装成一个跨度。

到目前为止我的 xslt:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:strip-space elements="*"/>
<xsl:preserve-space elements="t"/>
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>

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

  <xsl:template match="p/r[1]">
    <r>
      <t><xsl:value-of separator="" select="../r/t"/></t>
    </r>
  </xsl:template>
  
  <xsl:template match="p/r[position() gt 1]"/>
 </xsl:stylesheet>

只需组合这些 <t>-标签就可以正常工作。但我不知道如何编辑它们。

t 元素编写模板:

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

  <xsl:template match="p/r[1]">
    <r>
      <t>
        <xsl:apply-templates select="../r/t"/>        
      </t>
    </r>
  </xsl:template>
  
  <xsl:template match="p/r[rPr/rStyle/@val]/t">
    <span class="{../rPr/rStyle/@val}">
      <xsl:apply-templates/>
    </span>
  </xsl:template>
  
  <xsl:template match="p/r[not(rPr/rStyle/@val)]/t">
    <xsl:apply-templates/>
  </xsl:template>
  
  <xsl:template match="p/r[position() gt 1]"/>