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