Xml XSLT:仅应用多个匹配模板中的一个?

Xml XSLT:仅应用多个匹配模板中的一个?,xml,xslt,Xml,Xslt,在我的XSLT书籍中找不到任何类似的示例,但是,我真的不知道要查找什么。我试过用谷歌搜索它,但我真的不知道如何表达搜索词。我试图根据父节点的不同,对节点进行不同的处理。这是我的xml,非常简化 <body> <p>consequuntur magni dolores eos</p> <!-- Needs one LF --> <p>numquam eius modi tempora</p>

在我的XSLT书籍中找不到任何类似的示例,但是,我真的不知道要查找什么。我试过用谷歌搜索它,但我真的不知道如何表达搜索词。我试图根据父节点的不同,对
节点进行不同的处理。这是我的xml,非常简化

<body>
  <p>consequuntur magni dolores eos</p>        <!-- Needs one LF -->
  <p>numquam eius modi tempora</p>             <!-- Needs two LFs -->
  <ul>
    <li><p>aliquam quaerat voluptatem</p></li> <!-- Needs one LF -->
    <li><p>quis nostrum</p></li>               <!-- Needs two LFs -->
  </ul>
  <some><arbitrary><path><p>qui dolorem ipsum</p></path></arbitrary></some>
</body>

Consequintur magni dolores eos

时间上的变化

  • 阿利奎姆·奎拉特·沃鲁帕特姆

  • 这是我的秘方

同侧阴唇

我对非任意的
节点做得很好:

<xsl:template match="body/p[1] | li/p[1]">
    <xsl:text>&#10;</xsl:text>
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="body/p[position() > 1] | li/p[position() > 1]">
    <xsl:text>&#10;&#10;</xsl:text>
    <xsl:apply-templates/>
</xsl:template>






但是我还需要一个用于任意
的模板,这就是我遇到麻烦的地方:
也应用于主体和li
/code>节点


似乎最简单的方法就是让处理器不要将任意的
应用于所有内容,但我不知道如何做到这一点。我想也许可以在我的任意模板中添加类似
*[not(self::body)]/p |*[not(self::li)]/p的内容,但这是一个并集,我不知道如何获得交集。我已经看到了一些方法,包括Michael Kay的,但我无法理解符号,而且无论如何,我不确定这是最好的(正确的?)方法。

您可能正在寻找
优先级属性。你可以使用

<xsl:template match="p" priority="1">


您可能正在查找
优先级属性。你可以使用

<xsl:template match="p" priority="1">


选择所有
p
元素,除了那些是
body
li
元素的直接子元素之外,都可以通过单个谓词实现

*[not(self::body)]/p |*[not(self::li)]/p

非常接近,但是
|
不是or运算符,而是您指出的并集。因此,选择所有
p
元素并检查它们是否不是
body
的子元素,以及是否不是
li
的子元素成功

<xsl:template match="p[not(../../body) and not(../../li)]">
    <xsl:text>...</xsl:text>
    <xsl:apply-templates/>
</xsl:template>

...
应用DeMorgan可以简化为

<xsl:template match="p[not(../../body or ../../li)]">
    <xsl:text>...</xsl:text>
    <xsl:apply-templates/>
</xsl:template>

...

选择所有
p
元素,除了那些是
body
li
元素的直接子元素之外,都可以通过单个谓词实现

*[not(self::body)]/p |*[not(self::li)]/p

非常接近,但是
|
不是or运算符,而是您指出的并集。因此,选择所有
p
元素并检查它们是否不是
body
的子元素,以及是否不是
li
的子元素成功

<xsl:template match="p[not(../../body) and not(../../li)]">
    <xsl:text>...</xsl:text>
    <xsl:apply-templates/>
</xsl:template>

...
应用DeMorgan可以简化为

<xsl:template match="p[not(../../body or ../../li)]">
    <xsl:text>...</xsl:text>
    <xsl:apply-templates/>
</xsl:template>

...