【发布时间】:2015-01-18 15:45:02
【问题描述】:
请建议如何根据特定的注释文本()拆分 xml 节点。我尝试通过使用 xsl:text disable-output-escaping 格式来放置所需的结束和开始标签(元素)。
- 我的代码是静态的,如何使动态代码适用于评论文本的任意数量的祖先,即如果祖先计数为 'n',则来自 n to 1如何利用call-template方法。
- 出现了一些不是内容祖先的空节点,如何避免这些
我参考了我们网站上的一些建议,但很难理解其中的逻辑。请建议。 (XSLT 2 版本)
XSLT:
<root>
<a>
<b>The text1
<c>
<d>The text2</d><d>The text3</d><!--Break--><d>The text4</d>
<e>The text5<!--Break--></e>
</c>
<f>The text6</f>
</b>
</a>
</root>
XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
</xsl:template>
<xsl:template match="//comment()[contains(., 'Break')]">
<xsl:variable name="varAncestorCount" select="count(ancestor::*)"/>
<xsl:choose>
<xsl:when test="$varAncestorCount = 4">
<xsl:text disable-output-escaping="yes"></</xsl:text><xsl:value-of select="ancestor::*[1]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"></</xsl:text><xsl:value-of select="ancestor::*[2]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"></</xsl:text><xsl:value-of select="ancestor::*[3]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"></</xsl:text><xsl:value-of select="ancestor::*[4]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:comment><xsl:value-of select="."/></xsl:comment>
<xsl:text disable-output-escaping="yes"><</xsl:text><xsl:value-of select="ancestor::*[4]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"><</xsl:text><xsl:value-of select="ancestor::*[3]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"><</xsl:text><xsl:value-of select="ancestor::*[2]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"><</xsl:text><xsl:value-of select="ancestor::*[1]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
</xsl:when>
<xsl:when test="$varAncestorCount = 5">
<xsl:text disable-output-escaping="yes"></</xsl:text><xsl:value-of select="ancestor::*[1]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"></</xsl:text><xsl:value-of select="ancestor::*[2]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"></</xsl:text><xsl:value-of select="ancestor::*[3]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"></</xsl:text><xsl:value-of select="ancestor::*[4]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"></</xsl:text><xsl:value-of select="ancestor::*[5]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:comment><xsl:value-of select="."/></xsl:comment>
<xsl:text disable-output-escaping="yes"><</xsl:text><xsl:value-of select="ancestor::*[5]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"><</xsl:text><xsl:value-of select="ancestor::*[4]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"><</xsl:text><xsl:value-of select="ancestor::*[3]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"><</xsl:text><xsl:value-of select="ancestor::*[2]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"><</xsl:text><xsl:value-of select="ancestor::*[1]/name()"/><xsl:text disable-output-escaping="yes">></xsl:text>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
期望的输出:
<root>
<a>
<b>The text1
<c>
<d>The text2</d>
<d>The text3</d>
</c>
</b>
</a>
</root>
<!--Break-->
<root>
<a>
<b>
<c>
<d>The text4</d>
<e>The text5</e>
</c>
</b>
</a>
</root>
<!--Break-->
<root>
<a>
<b>
<f>The text6</f>
</b>
</a>
</root>
【问题讨论】:
标签: xslt