按孤儿元素(或未知出身的元素)的顺序获取下一个兄弟姐妹

问题描述 投票:0回答:1

考虑(手写代码,请原谅任何意外)

<xsl:variable name="foo" as="document-node()">
   <xsl:document>
      <foo1>
      <foo2>
      <foo3>
   </xsl:document>
</xsl:variable>

<xsl:variable name="foos" select="$foo/*"/>
<xsl:variable name="isItFoo3" select="$foos[2]::following-sibling"/>
 

isItFoo3 是

<foo3>

不错

但是这个

<xsl:variable name="foos" as="element()*">
   <foo1>
   <foo2>
   <foo3>
</xsl:variable>

<xsl:variable name="isItFoo3" select="$foos[2]::following-sibling"/>

结果为空

因此,我假设以下兄弟姐妹需要一个父级(根据定义!),并且我的第二个示例中的文字元素在某种意义上是孤立的,因此它们不是兄弟姐妹。

这使得轴有点微妙,如果我想处理(有效地获取“尾部”)序列,我需要确保所有元素都有一个父元素并共享相同的父元素。

很公平,这是合乎逻辑的。

但是当我不确定元素的出身时,如何获得序列中的尾部(以下兄弟姐妹)?

(好吧,我可以明确地将它们复制到新文档中以确保,但这在代码和性能方面有点繁重)

xslt-2.0 xslt-3.0
1个回答
0
投票

所以你可以这样做

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all">
  
  <xsl:variable name="foos" as="element()*">
     <foo1/>
     <foo2/>
     <foo3/>
     <foo4/>
  </xsl:variable>
  
  <xsl:variable name="foo2" select="$foos[2]"/>
  
  <xsl:variable name="foos-after-foo2" select="let $pos := index-of($foos!generate-id(), generate-id($foo2)) return $foos[position() gt $pos]"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/" name="xsl:initial-template">
    <xsl:sequence select="$foos-after-foo2"/>
  </xsl:template>

</xsl:stylesheet>

我认为它可以在 XPath/XSLT 4 中更紧凑地表达,但我需要检查哪些函数和/或表达式当前是标准化的。

© www.soinside.com 2019 - 2024. All rights reserved.