请建议如何根据特定注释文本拆分 xml 节点 ()。我尝试使用xsl:文本禁用输出转义格式以放置所需的结束和开始标记(元素)。
- 我的代码是静态的,如何制作动态代码,该代码适用于注释文本方面的任意数量的祖先,即,如果祖先计数'n',然后从n to 1如何使用调用模板方法。
- 出现一些空节点,它们不是内容的祖先,如何避免这些
我参考了我们网站上的一些建议,但发现很难理解其中的逻辑。请建议。 (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>
[呻吟]你在哪里找到这些“有趣”的任务?
您永远不需要使用转义文本手动形成 XML 节点。
尝试以下样式表。它可能会更加精简,但我相信它解决了这里的主要问题:
XSLT 2.0
<xsl:stylesheet version="2.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:variable name="root" select="/*" />
<xsl:template match="/">
<super-root>
<xsl:for-each select="0 to count(//comment()[.='Break'])">
<xsl:apply-templates select="$root">
<xsl:with-param name="i" select="." tunnel="yes"/>
</xsl:apply-templates>
<xsl:if test="position()!=last()">
<xsl:comment>Break</xsl:comment>
</xsl:if>
</xsl:for-each >
</super-root>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:param name="i" tunnel="yes"/>
<xsl:if test="descendant-or-self::text()[count(preceding::comment()[.='Break'])=$i]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Result:
<?xml version="1.0" encoding="UTF-8"?>
<super-root>
<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>
</super-root>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)