此 XML 输入:
<?xml version="1.0" encoding="utf-8"?>
<Section>
<Chapter>
<Title>
<Marker>MarkerText1</Marker>some text1
</Title>
</Chapter>
<Chapter>
<Title>
<Marker>MarkerText2</Marker>some text2
<Marker>MarkerText3</Marker>some text3
</Title>
</Chapter>
</Section>
提供给此 XSLT 转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<Titles>
<xsl:apply-templates/>
</Titles>
</xsl:template>
<xsl:template match="Title">
<Title><xsl:apply-templates select="text()"/></Title>
</xsl:template>
<xsl:template match="Title/text()">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
产生这个 XML 输出:
<?xml version="1.0" encoding="UTF-8"?>
<Titles>
<Title>some text1
</Title>
<Title>some text2
some text3
</Title>
</Titles>
解释:
- 模板为生成的元素
match="/"
建立一个根
Title
元素。(您在问题中提到的无根Title
元素序列不是格式良好的 XML。)
match="Title"
模板生成请求的元素并在包含的节点Title
上应用模式匹配。text()
- 模板复制作为输入 XML
match="Title/text()
中元素子级的文本节点。Title
如果您希望输出如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Titles>
<Title>some text1</Title>
<Title>some text2 some text3</Title>
</Titles>
您可以将这个稍微复杂的模板用于match="Title/text()"
:
<xsl:template match="Title/text()">
<xsl:if test="preceding-sibling::text()">
<xsl:text> </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space()"/>
</xsl:template>