2

假设我有一个这样的源示例文档:

<html>
  <b><i><u>TestBIU</u></i></b>
  <i><b><u>TestIBU</u></b></i>
  <i><u><b>TestIUB</b></u></i>
  <b><u><i>TestBUI</i></u></b>
  <u><i><b>TestUIB</b></i></u>
  <u><b><i>TestUBI</i></b></u>
  <u>TestU</u>
  <i>TestI</i>
  <b>TestB</b>
  <u><b>TestUB</b></u>
</html>

我需要一个 XSLT 模板来产生这个:

<html>
  <b><i>TestBIU</i></b>
  <i><b>TestIBU</b></i>
  <i><b>TestIUB</b></i>
  <b><i>TestBUI</i></b>
  <i><b>TestUIB</b></i>
  <b><i>TestUBI</i></b>
  <u>TestU</u>
  <i>TestI</i>
  <b>TestB</b>
  <b>TestUB</b>
</html>

因此,当它与斜体和/或粗体标签结合出现时,它应该删除下划线标签。当只加下划线时,它应该保留。任何想法如何解决这个特定问题?

这是我的尝试,但如果 TestUIB 和 TestUBI 失败:

<xsl:template match="/">
    <html>
    <xsl:apply-templates />
    </html>
</xsl:template>
<xsl:template match="b/u">
      <xsl:apply-templates />
</xsl:template>
<xsl:template match="i/u">    
      <xsl:apply-templates />
</xsl:template>
<xsl:template match="u/i">
  <i><xsl:apply-templates /></i>
</xsl:template> 
<xsl:template match="u/b">
    <b><xsl:apply-templates /></b>
</xsl:template>    
<xsl:template match="b | u | i">
    <xsl:copy>
        <xsl:apply-templates select="* | text()"/>
    </xsl:copy>
</xsl:template>
4

2 回答 2

3

我认为

<xsl:stylesheet 
  version="1.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="b//u | i//u | u[b] | u[i]">
  <xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>

就够了。

于 2012-11-16T10:46:41.583 回答
2

试试这个:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="u[ancestor::b | ancestor::i | descendant::b | descendant::i]">
    <xsl:apply-templates />
</xsl:template>

</xsl:stylesheet>

它为您的示例生成以下输出:

<html>
    <b><i>TestBIU</i></b>
    <i><b>TestIBU</b></i>
    <i><b>TestIUB</b></i>
    <b><i>TestBUI</i></b>
    <i><b>TestUIB</b></i>
    <b><i>TestUBI</i></b>
    <u>TestU</u>
    <i>TestI</i>
    <b>TestB</b>
    <b>TestUB</b>
</html>

Description: In my solution I'm using identity transform that copies everything node by node and attribute by attribute. The second template intercepts all <u> HTML tags that have <i> or <b> amongst their ancestors or descendants. When such situation occurs, we do not copy the tag, but only invoke apply-templates which will take care of its children.

于 2012-11-16T11:14:18.393 回答