2

就像在另一个问题中一样,我很难用 XSLT1 表达简单的事情......

xsl:stylesheet我有这种“类似身份”的转换中,将一个属性添加align="center"到一个TD带有其他属性的标签中(必须留在那里)......添加的触发器align是标签中存在一个CENTER标签TD。(稍后标签CENTER将被删除)。

<xsl:template match="@*|node()" name="identity">
  <xsl:copy>
    <xsl:if test="name()='td'  and .//center">
               <xsl:attribute name="align">center</xsl:attribute>
    </xsl:if>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template> 

此代码可以正常工作(xsl:if被忽略)。


需要td//center,不仅td/center没有td/p/center。必须是通用的,对于任何td//center. 输入示例:

<td colspan="2">
   <p><center>POF</center></p>
</td>
4

2 回答 2

4

从问题评论:

现在的问题:<td align="x"><p><center>没有改变,只有<td><p><center>

那将是因为您正在align使用添加属性

<xsl:attribute name="align">center</xsl:attribute>

复制现有的

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

当您尝试将两个具有相同名称的属性添加到同一个元素时,添加的一秒(在本例中是从输入元素复制的一秒)将获胜。

我肯定会将逻辑拆分为单独的模板:

<!-- copy everything as-is except for more specific templates below -->
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<!-- add align="center" to any td with a <center> descendant -->
<xsl:template match="td[.//center]">
  <td align="center">
    <!-- ignore any existing align attribute on the input td -->
    <xsl:apply-templates select="@*[local-name() != 'align'] | node()" />
  </td>
</xsl:template>

<!-- remove any <center> that's inside a td, but keep processing its children -->
<xsl:template match="td//center">
  <xsl:apply-templates />
</xsl:template>

这将改变

<td colspan="2" align="left">
   <p><center>POF</center></p>
</td>

进入

<td align="center" colspan="2">
   <p>POF</p>
</td>

请注意,它是td[.//center]-td具有center元素后代的元素 - 不同于td[//center]-td出现在文档中的元素,该文档包含其中任何center位置的任何元素(不一定在td.

于 2013-08-06T16:48:57.340 回答
2

使用以下输入 XML:

<td colspan="2">
  <p>
    <center>POF</center>
  </p>
</td>

这个 XSL 样式表:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:strip-space elements="*"/>

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

  <!-- Match any td elements with center descendants. -->
  <xsl:template match="td[.//center]">
    <xsl:copy>
      <!-- Add a new align attribute, then copy the original attributes and child nodes. -->
      <xsl:attribute name="align">center</xsl:attribute>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

输出此 XML:

<td align="center" colspan="2">
  <p>
    <center>POF</center>
  </p>
</td>

如果要删除“中心”元素,请添加以下模板:

<xsl:template match="center"/>
于 2013-08-06T11:55:13.950 回答