2

我有一个 xml 文件,比方说:  

<parent>
    <notimportant1>
    </notimportant1>.    
    <notimportant2>
    </notimportant2>.   
     ....
    <child>
        <grandchild>.   
         ....
        </grandchild>
        <grandchild>
         ....
        </grandchild>. 
         ....
        <notimportant3>
        </notimportant3>
    </child>
<parent>
 

还有xsl文件:

<xsl:template match="parent">.   
      ...
      ...
     <xsl:for-each select="child">.    
         <xsl:for-each select="grandchild">
          ...
         </xsl:for-each>.    
     </xsl:for-each>
      ....
</xsl:template>

现在,我必须创建新xsl文件,该文件只能导入/包含这个现有的xsl.

是否可以覆盖这个 for-each 行为,以便我只能显示一些预定义的文本/链接来代替它?

我无法修改现有的 xsl,并且我想使用模板中的所有其他内容 - 不能只定义具有更高优先级的新 xsl。

4

2 回答 2

5

您可以重新设计原始样式表以使用xsl:apply-templates而不是xsl:for-each. 像这样的东西:

<xsl:template match="parent">
  ...   
  ...
  <xsl:apply-templates select="child"/>
  ....
</xsl:template>

<xsl:template match="child">
   <xsl:apply-templates select="grandchild"/>    
</xsl:template>

<xsl:template match="grandchild">
   ...
</xsl:template>

然后,当您将此样式表导入另一个样式表时,您可以覆盖匹配的模板childgrandchild根据需要覆盖。

于 2012-07-30T13:40:52.410 回答
2

这里的策略是定义第二个模板匹配parent以确保导入的模板永远不会运行(因为您无法更改导入的模板,也无法在匹配后抑制其行为)。

默认情况下,导入模板的优先级低于本地模板,因此只需定义另一个模板即可解决此问题。

您还可以通过为模板赋予priority属性来控制优先级。它越高,匹配节点集的可能性就越大(意味着较低优先级的节点集不会匹配)。

模板模式也是一种选择,但我认为你已经足够在这里进行了。

XML 转换 - xsl:template(优先级)

XSLT 元素

于 2012-07-30T13:09:21.567 回答