我已经问过question与此有关,但我认为我不会面临另一个问题。这是我的示例XML文件:
<section>
Hello everyone, I'm
<bold>Hackmania</bold>
<bold>15</bold>
<line/>
I am looking for an
<highlight>answer</highlight>
<paragraph/>
Here is an other
<bold>paragraph</bold>
<highlight>with the same tags</highlight>
<paragraph/>
</section>
我怎样才能将我的孤立文本放入特定标签中,让我们说<myText></myText>
?像这样:
<section>
<p>
<myText>Hello everyone, I'm</myText>
<bold>Hackmania</bold>
<bold>15</bold>
<line/>
<myText>I am looking for an</myText>
<highlight>answer</highlight>
</p>
<p>
<myText>HHere is an other</myText>
<bold>paragraph</bold>
<highlight>with the same tags</highlight>
</p>
</section>
提前感谢您的帮助。
答案 0 :(得分:1)
而不是
<xsl:for-each select="paragraph">
<p>
<xsl:copy-of select="key('grpById', generate-id())"/>
</p>
</xsl:for-each>
在引用的解决方案中,您可以使用
<xsl:for-each select="paragraph">
<p>
<xsl:apply-templates select="key('grpById', generate-id())"/>
</p>
</xsl:for-each>
然后确保你做
<xsl:template match="section/text()">
<myText>
<xsl:value-of select="normalize-space()"/>
</myText>
</xsl:template>
加上身份转换模板
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
将其余部分复制不变。
那么整个样式表就是
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="grpById" match="node()[not(self::paragraph)]" use="generate-id(following-sibling::paragraph[1])" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="section/text()">
<myText>
<xsl:value-of select="normalize-space()"/>
</myText>
</xsl:template>
<xsl:template match="/section">
<xsl:copy>
<xsl:for-each select="paragraph">
<p>
<xsl:apply-templates select="key('grpById', generate-id())"/>
</p>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>