XSLT到达后代节点

时间:2014-05-28 14:01:43

标签: xslt

请建议在所有'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">&lt;!--false buildup--&gt;</xsl:text>
      </xsl:if>
          <xsl:copy-of select="."/>
  </xsl:template>
</xsl:stylesheet> 

必需的OutPut:

对于此输入XML,应该有三个“false buildup”注释文本。请建议。 (我使用的是XSLT2版本)

1 个答案:

答案 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>