使用XSLT 1.0的组元素

时间:2013-03-11 13:08:20

标签: xslt

我需要将<math>元素和输出<math>元素分组。我试过XSLT。 请注意,元素可以出现在文档中的任何位置,并且根元素也可以更改

XSLT 1.0尝试:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:m="http://www.w3.org/1998/Math/MathML">
<xsl:key name="aKey" match="m:math" use="."/>

<xsl:template match="node()">
<xsl:copy-of select="key('aKey',m:math)"/>
</xsl:template>
</xsl:stylesheet>

示例XML:

<?xml version="1.0"?>
<chapter xmlns:m="http://www.w3.org/1998/Math/MathML">
<p>This is sample text
<a><math>This is math</math></a></p>
<a>This is a</a>
<math>This is math</math>
<a>This is a</a>
<a>This is a</a>
<b>This is <math>This is math</math>b</b>
<c>This is C</c>
</chapter>

需要输出:

<math>This is math</math>
<math>This is math</math>
<math>This is math</math>

1 个答案:

答案 0 :(得分:0)

这样做:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" />

  <xsl:template match="math | math//*" priority="2">
    <xsl:element name="{name()}">
      <xsl:apply-templates select="@* | node()" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="math//@* | math//node()">
    <xsl:copy />
  </xsl:template>

  <xsl:template match="text()" />
</xsl:stylesheet>

在样本输入上运行时,会产生:

<math>This is math</math>
<math>This is math</math>
<math>This is math</math>

使用键的方法,它产生相同的输出:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" />
  <xsl:key name="kMath" match="math" use="''" />

  <xsl:template match="/">
    <xsl:apply-templates select="key('kMath', '')" />
  </xsl:template>

  <xsl:template match="*">
    <xsl:element name="{name()}">
      <xsl:apply-templates select="@* | node()" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="@* | node()" priority="-2">
    <xsl:copy />
  </xsl:template>
</xsl:stylesheet>