【问题标题】:Overriding for-each xslt覆盖 for-each xslt
【发布时间】:2012-07-30 21:40:52
【问题描述】:

我有一个 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。

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    您可以重新设计原始样式表以使用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的模板。

    【讨论】:

    • 是的。人们通常很难解释为什么人们应该使用 apply-templates 而不是 for-each,而可覆盖性是最切实的好处之一。
    【解决方案2】:

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

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

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

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

    XML Transforms - xsl:template (priority)

    XSLT Element

    【讨论】:

    • 击败我,大约 5 秒。
    • 问题是,我想使用模板中的所有其他内容,因此我无法覆盖整个模板。
    • 这是不可能的。如果您希望导入模板的某些端口运行但不运行其他端口,则必须按照我的描述复制模板,但删除您不想要的部分。
    • 这是对导入优先规则的相当松散和不准确的解释。特别是: 1. 导入模板的导入优先级总是低于importing样式表中的模板。 2、没有“原生模板”之类的说法。 3. xsl;templatepriority 属性仅在两个模板具有相同的导入优先级(例如属于同一个样式表)时才考虑。见:w3.org/TR/1999/REC-xslt-19991116#dt-import-precedence
    • @SeanB.Durkin:你不必撤回你的答案,因为这个答案包含相当松散和不正确的陈述——请参阅我之前的评论。我会鼓励你想出一个更精确/正确的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2018-07-16
    相关资源
    最近更新 更多