xslt - 如何选择从特定节点而不是根节点开始的文本节点的前面节点?

标签 xslt xpath xslt-2.0 xpath-2.0

如何从我知道其ID的特定节点开始选择文本节点的前面节点,而不是从根节点获取文本节点?

当我从文本节点的模板匹配中调用以下内容时,
我从根获得所有前面的文本节点。我想修改上面的代码,以选择仅在具有特定ID的节点说123之后出现的文本节点。即/// * [@ id ='123']之类的东西

          <xsl:template match="text()[. is $text-to-split]"> 
          <xsl:variable name="split-index" as="xsd:integer" 
           select="$index - sum(preceding::text()/string-length(.))"/> 
          <xsl:value-of select="substring(., 1, $split-index - 1)"/> 
          <xsl:copy-of select="$new"/> 
          <xsl:value-of select="substring(., $split-index)"/> 
          </xsl:template> 

         <xsl:variable name="text-to-split" as="text()?" 
         select="descendant::text()[sum((preceding::text(), .)/string-length(.)) ge $index][1]"/> 


如何在我使用previous :: text的位置中包含条件,以便选择相对于我知道的特定节点ID的先前文本节点?

最佳答案

您可以使用以下几种变体:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:strip-space elements="*"/>
 <xsl:output method="text"/>

 <xsl:variable name="vStart" select="/*/*[@myId='123']/text()"/>
 <xsl:variable name="vEnd" select="/*/*[last()]"/>

    <xsl:template match="/">
      <xsl:value-of select=
       "*/*[last()]
             /sum(preceding::text()
                 intersect
                  $vStart/following::text()
                  )
     "/>
---------------
      <xsl:value-of select=
       "*/*[last()]
             /sum(preceding::text()[. >> $vStart])
     "/>
--------------- 
      <xsl:value-of select=
       "sum(/*/*[. >> $vStart and . &lt;&lt; $vEnd])
     "/>
    </xsl:template>
</xsl:stylesheet>


在以下XML文档上应用此转换时:

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num myId='123'>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>010</num>
</nums>


产生了预期的结果:

30
---------------
      30
--------------- 
      30

关于xslt - 如何选择从特定节点而不是根节点开始的文本节点的前面节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2783434/

相关文章:

XSLT 匹配节点不是值

php - 如何在 Wordpress 中使用 PHP 使用 XSLT 转换 XML

xml - 使用XSL将XML树转换为平面节点列表

xml - XSLT用于具有相同名称的多个元素

xpath - 在 Scrapy 中选择下一个 sibling 的序列

c# - XPath/HtmlAgilityPack : How to find an element (a) with a specific value for an attribute (href) and find adjacent table columns?

xml - 对 XML 进行递归排序 - 仅对内部节点进行排序

html - xsltproc html 文档

xslt 1.0 如何测试数字

javascript - 使用 document.evaluate 时未定义 XPath 元素/对象