0

我只需要对<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>
4

1 回答 1

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>
于 2013-03-11T13:32:17.753 回答