XSLT:如何在 p 元素中连接 t 元素
XSLT: How to concatenate t-Elements within a p-Element
我需要在 p 元素中连接 t 元素。我尝试使用 xsl:for-each-group 并将来自 t 元素的文本存储在一个变量中。但是我不能在 xsl:template.
之外使用这个变量
来源:
<document>
<body>
<p>
<pPr>
<spacing line="286" lineRule="auto"/>
</pPr>
<r>
<t>First:</t>
</r>
</p>
<p>
<pPr>
<numPr>
<ilvl val="0"/>
<numId val="17"/>
</numPr>
<spacing line="286" lineRule="auto"/>
</pPr>
<r>
<t>Second</t>
</r>
<r>
<t space="preserve"> third</t>
</r>
<r>
<t space="preserve"> </t>
</r>
<r>
<t>last.</t>
</r>
</p>
</body>
</document>
期望的结果:
<document>
<body>
<p>
<pPr>
<spacing line="286" lineRule="auto"/>
</pPr>
<r>
<t>First:</t>
</r>
</p>
<p>
<pPr>
<numPr>
<ilvl val="0"/>
<numId val="17"/>
</numPr>
<spacing line="286" lineRule="auto"/>
</pPr>
<r>
<t>Second third last.</t>
</r>
</p>
</body>
</document>
到目前为止我的尝试:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/mf"
xmlns:w="www.wnamespace.com"
version="2.0"
exclude-result-prefixes="xs mf w">
<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">
<xsl:for-each-group select="node()" group-adjacent="boolean(self::r)">
<xsl:variable name="concat-t">
<xsl:sequence select="current-group()[self::r]"></xsl:sequence>
</xsl:variable>
<xsl:choose>
<xsl:when test="self::r">
</xsl:when>
<xsl:otherwise>
<p><xsl:copy-of select="current-group()"/></p>
</xsl:otherwise>
</xsl:choose>
<t><xsl:value-of select="$concat-t"/></t>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
我是 XSLT 2.0 的新手,有点不知所措。任何帮助都适用。
XsltFiddle: http://xsltfiddle.liberty-development.net/pNEj9dj
好像恒等变换加上两个模板
<xsl:template match="p/r[1]">
<p>
<t>
<xsl:value-of select="../r/t"/>
</t>
</p>
</xsl:template>
<xsl:template match="p/r[position() gt 1]"/>
应该完成这项工作。
我需要在 p 元素中连接 t 元素。我尝试使用 xsl:for-each-group 并将来自 t 元素的文本存储在一个变量中。但是我不能在 xsl:template.
之外使用这个变量来源:
<document>
<body>
<p>
<pPr>
<spacing line="286" lineRule="auto"/>
</pPr>
<r>
<t>First:</t>
</r>
</p>
<p>
<pPr>
<numPr>
<ilvl val="0"/>
<numId val="17"/>
</numPr>
<spacing line="286" lineRule="auto"/>
</pPr>
<r>
<t>Second</t>
</r>
<r>
<t space="preserve"> third</t>
</r>
<r>
<t space="preserve"> </t>
</r>
<r>
<t>last.</t>
</r>
</p>
</body>
</document>
期望的结果:
<document>
<body>
<p>
<pPr>
<spacing line="286" lineRule="auto"/>
</pPr>
<r>
<t>First:</t>
</r>
</p>
<p>
<pPr>
<numPr>
<ilvl val="0"/>
<numId val="17"/>
</numPr>
<spacing line="286" lineRule="auto"/>
</pPr>
<r>
<t>Second third last.</t>
</r>
</p>
</body>
</document>
到目前为止我的尝试:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/mf"
xmlns:w="www.wnamespace.com"
version="2.0"
exclude-result-prefixes="xs mf w">
<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">
<xsl:for-each-group select="node()" group-adjacent="boolean(self::r)">
<xsl:variable name="concat-t">
<xsl:sequence select="current-group()[self::r]"></xsl:sequence>
</xsl:variable>
<xsl:choose>
<xsl:when test="self::r">
</xsl:when>
<xsl:otherwise>
<p><xsl:copy-of select="current-group()"/></p>
</xsl:otherwise>
</xsl:choose>
<t><xsl:value-of select="$concat-t"/></t>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
我是 XSLT 2.0 的新手,有点不知所措。任何帮助都适用。 XsltFiddle: http://xsltfiddle.liberty-development.net/pNEj9dj
好像恒等变换加上两个模板
<xsl:template match="p/r[1]">
<p>
<t>
<xsl:value-of select="../r/t"/>
</t>
</p>
</xsl:template>
<xsl:template match="p/r[position() gt 1]"/>
应该完成这项工作。