XSLT-选择给定标记的所有同级,直到另一个标记(再次)

XSLT-选择给定标记的所有同级,直到另一个标记(再次),xslt,xpath,Xslt,Xpath,给定以下XML,我想选择“第一个标题”和“第二个标题”之间的每个潜在元素,这些标题元素被排除在外。 我不确定我可以使用哪个版本的XSLT(我正在修改由专有应用程序运行的工作表…) 您可以使用以下XPath表达式(已更新以避免选择第二个sectiontitle元素): 基本上,XPath返回第一个标题元素的后面的同级元素,其中最近的前面同级'sectiontitle'是第一个标题元素本身。您可以使用下面的XPath表达式(更新以避免选择第二个sectiontitle元素): 基本上,XPath返回

给定以下XML,我想选择“第一个标题”和“第二个标题”之间的每个潜在元素,这些标题元素被排除在外。 我不确定我可以使用哪个版本的XSLT(我正在修改由专有应用程序运行的工作表…)


您可以使用以下XPath表达式(已更新以避免选择第二个
sectiontitle
元素):


基本上,XPath返回
第一个标题
元素的
后面的同级
元素,其中最近的前面同级
'sectiontitle'
第一个标题
元素本身。

您可以使用下面的XPath表达式(更新以避免选择第二个
sectiontitle
元素):


基本上,XPath返回
第一个标题
元素的
以下同级
元素,其中最近的前同级
'sectiontitle'
第一个标题
元素本身。

我认为这更简单,这意味着您可以指定要在哪两个标题之间输出:

//p[@class='sectiontitle' and text()='Second heading']/preceding-sibling::*[preceding-sibling::p[@class='sectiontitle'][1] = 'First heading']

例如,如果您想在“
第二个标题
”和“
第三个标题
”之间获得输出,只需将上述表达式中的“
第二个标题
”更改为“
第三个标题
”,并将“
第一个标题
”更改为“
第二个标题
”,我认为这更简单,这意味着您可以指定要在哪两个标题之间输出:

//p[@class='sectiontitle' and text()='Second heading']/preceding-sibling::*[preceding-sibling::p[@class='sectiontitle'][1] = 'First heading']

例如,如果您想在“
第二个标题
”和“
第三个标题
”之间获得输出,只需将“
第二个标题
”更改为“
第三个标题
”,并将“
第一个标题
”更改为“
第二个标题
”,在上述表达式中,我发现了一个使用ID回答我自己问题的好方法

假设您希望选择当前标记的以下同级(在我的示例中是sectiontitle),直到找到任何具有“title”外观类的元素,例如
paragraphtitle
sectiontitle

 <xsl:variable name="thisgid" select="generate-id(.)" />
 <xsl:apply-templates select="following-sibling::*[not(@class='sectiontitle' or @class='paragraphtitle')]
                              [generate-id(preceding-sibling::p[@class='sectiontitle'][1]) = $thisgid]"/>


这解决了我的许多问题

我发现了一个使用ID回答我自己问题的好方法

假设您希望选择当前标记的以下同级(在我的示例中是sectiontitle),直到找到任何具有“title”外观类的元素,例如
paragraphtitle
sectiontitle

 <xsl:variable name="thisgid" select="generate-id(.)" />
 <xsl:apply-templates select="following-sibling::*[not(@class='sectiontitle' or @class='paragraphtitle')]
                              [generate-id(preceding-sibling::p[@class='sectiontitle'][1]) = $thisgid]"/>


这解决了我的许多问题

谢谢你(快速)的回答。这是一个重大的飞跃,但仍然没有返回预期的结果。在修改了您的答案后,我还注意到,第一个标题不必是p[@class='sectiontitle'][1],但必须由我提到的两个临界点确定。这件事很棘手。@Flag你不认为前面的兄弟姐妹::p[@class='sectiontitle'][1]='First heading'
这个表达式涵盖了这两个条件吗?@Flag不客气!另一方面,XSLT具有类似于
current()
的功能和变量,您可以利用它们来避免构造太复杂/太长的XPath表达式——如果问题中有更多XSLT上下文的话:谢谢(快速)回答。这是一个重大的飞跃,但仍然没有返回预期的结果。在修改了您的答案后,我还注意到,第一个标题不必是p[@class='sectiontitle'][1],但必须由我提到的两个临界点确定。这件事很棘手。@Flag你不认为前面的兄弟姐妹::p[@class='sectiontitle'][1]='First heading'
这个表达式涵盖了这两个条件吗?@Flag不客气!顺便说一句,XSLT具有
current()
等功能和变量,您可以利用这些功能避免构造太复杂/太长的XPath表达式——如果问题中有更多的XSLT上下文:这也很酷,我可能会尝试一下,我相信其他人也会感兴趣。谢谢你的回答。那也很酷,我可以试一试,我相信其他人也会感兴趣的。谢谢你的回答。
//p[@class='sectiontitle' and text()='Second heading']/preceding-sibling::*[preceding-sibling::p[@class='sectiontitle'][1] = 'First heading']
 <xsl:variable name="thisgid" select="generate-id(.)" />
 <xsl:apply-templates select="following-sibling::*[not(@class='sectiontitle' or @class='paragraphtitle')]
                              [generate-id(preceding-sibling::p[@class='sectiontitle'][1]) = $thisgid]"/>