请建议在所有'mfenced'元素之前插入注释文本,这些元素具有'msub'作为其后代。但是我的编码能够在第一个'mfenced'节点之前插入注释文本,但是无法为其他'mfenced'节点插入后续'mfenced'。
XML:
<root>
<math display="block">
<mfenced separators="" open="{" close="">
<mrow>
<msub>
<mi>t</mi>
<mn>2</mn>
</msub>
<mfenced separators="" open="{" close="">
<mrow>
<msub>
<mi>t</mi>
<mn>3</mn>
</msub>
<mfenced separators="" open="{" close="">
<mrow>
<msub>
<mi>t</mi>
<mn>4</mn>
</msub>
</mrow>
</mfenced>
</mrow>
</mfenced>
</mrow>
</mfenced>
</math>
</root>
XSLT:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="mfenced">
<xsl:if test="descendant::msub">
<xsl:text disable-output-escaping="yes"><!--false buildup--></xsl:text>
</xsl:if>
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
必需的OutPut:
对于此输入XML,应该有三个“false buildup”注释文本。请建议。 (我使用的是XSLT2版本)
答案 0 :(得分:1)
我认为你的代码应该可以做,虽然我会将条件移到匹配模式中,使用xsl:comment
创建评论并且只使用next-match
:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="mfenced[descendant::msub]">
<xsl:comment select="'false buildup'"/>
<xsl:next-match/>
</xsl:template>
</xsl:stylesheet>
使用转换输入的Saxon 9.5
<root>
<math display="block">
<mfenced separators="" open="{" close="">
<mrow>
<msub>
<mi>t</mi>
<mn>2</mn>
</msub>
<mfenced separators="" open="{" close="">
<mrow>
<msub>
<mi>t</mi>
<mn>3</mn>
</msub>
<mfenced separators="" open="{" close="">
<mrow>
<msub>
<mi>t</mi>
<mn>4</mn>
</msub>
</mrow>
</mfenced>
</mrow>
</mfenced>
</mrow>
</mfenced>
</math>
</root>
进入结果
<?xml version="1.0" encoding="UTF-8"?><root>
<math display="block">
<!--false buildup--><mfenced separators="" open="{" close="">
<mrow>
<msub>
<mi>t</mi>
<mn>2</mn>
</msub>
<!--false buildup--><mfenced separators="" open="{" close="">
<mrow>
<msub>
<mi>t</mi>
<mn>3</mn>
</msub>
<!--false buildup--><mfenced separators="" open="{" close="">
<mrow>
<msub>
<mi>t</mi>
<mn>4</mn>
</msub>
</mrow>
</mfenced>
</mrow>
</mfenced>
</mrow>
</mfenced>
</math>
</root>