Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xslt设计模式_Xslt - Fatal编程技术网

xslt设计模式

xslt设计模式,xslt,Xslt,我的xslt引擎中有一些设计问题。 很快,我在其他XML文档中转换XML文档(第一个是元模型,第二个是OpenDocumentXML) 有一次,我想根据一些条件输出元素的内容文本节点。 让我们使用一个虚拟示例: <father haircolor='blond'> <son> some text </son> <sister> some stupid text </sister&

我的xslt引擎中有一些设计问题。 很快,我在其他XML文档中转换XML文档(第一个是元模型,第二个是OpenDocumentXML)

有一次,我想根据一些条件输出元素的内容文本节点。 让我们使用一个虚拟示例:

<father haircolor='blond'>
    <son>
        some text
    </son>
    <sister>
        some stupid text
    </sister>
</father>

一些文本
一些愚蠢的文字
我想输出
元素的文本节点,如果它的父元素是一个“金发父亲”,并且它有一个姐妹节点

我对此有不同的解决方案:

首先是使用精确的模式:

<xsl:template match="father[haircolor='blond']>...</xsl:template>

<xsl:template match="son[following-sibling::sister]>...</xsl:template>
。。。
第二种是在模板中使用模式属性:

<xsl:template match="father[haircolor='blond' and son and sister]">
    <xsl:apply-template select='*' mode='ConditionsAreOk'/>
</xsl:template>

第三种方法是在叶模板中使用xsl:if:

<xsl:template match="son">
    <xsl:if test="parent::father/@haircolor = 'blond' and following-sibling::sister>
         {.}
    </xsl:if>
</xsl:template>


我强烈建议尽量避免使用明确的条件指令,而是使用模板匹配模式

在这种情况下,我会使用:

<xsl:template match="father[haircolor='blond']/son[following-sibling::sister]>
  <!-- your code here -->
</xsl:template>

我强烈建议尽量避免使用显式条件指令,而是使用模板匹配模式

在这种情况下,我会使用:

<xsl:template match="father[haircolor='blond']/son[following-sibling::sister]>
  <!-- your code here -->
</xsl:template>

Ok。你怎么看待mode属性?如果您在中间级别(例如在父[haircolor='blond']级别)使用它来简化下一级别中匹配属性的XPath。因为我发现当模板有硬XPath时很难阅读。@EricS。当同一个节点被不同的模板多次处理时,模式很有用,否则使用模式没有任何意义。我经常在多通道处理中使用模式——通常在mode=“pass2”、…等模式下完成pass2处理。谢谢您的回答。我个人和你一样使用模式,一个文档的多个处理。但我必须承认,当我为同一个节点使用多个模板,并且有几个复杂的Xpath匹配时,我也使用了它们。我希望在更简单的时候计算这个XPath‘早’(以XML树的形式),并对下行节点使用then模式,而不是匹配属性中的XPath。它还可以防止模棱两可的模板规则。但也许这是“肮脏的”…@EricS,不,只要模式不太多,你对它们的名字有一个约定,并牢牢记住哪种模式意味着什么就好了。当然,将处理拆分为多个模式可能会导致重复和无法重复使用。好的。你怎么看待mode属性?如果您在中间级别(例如在父[haircolor='blond']级别)使用它来简化下一级别中匹配属性的XPath。因为我发现当模板有硬XPath时很难阅读。@EricS。当同一个节点被不同的模板多次处理时,模式很有用,否则使用模式没有任何意义。我经常在多通道处理中使用模式——通常在mode=“pass2”、…等模式下完成pass2处理。谢谢您的回答。我个人和你一样使用模式,一个文档的多个处理。但我必须承认,当我为同一个节点使用多个模板,并且有几个复杂的Xpath匹配时,我也使用了它们。我希望在更简单的时候计算这个XPath‘早’(以XML树的形式),并对下行节点使用then模式,而不是匹配属性中的XPath。它还可以防止模棱两可的模板规则。但也许这是“肮脏的”…@EricS,不,只要模式不太多,你对它们的名字有一个约定,并牢牢记住哪种模式意味着什么就好了。当然,将处理拆分为多个模式可能会导致重复和无法重复使用。