首页 > 解决方案 > 选择表亲 - 即前面和前面的兄弟姐妹的问题

问题描述

如果我有以下 xml

<root>
  <house id="1">
    <occupant>
    </occupant>
    <occupant>
    </occupant>
  </house>
  <house id="2">
    <occupant>
    </occupant>
    <occupant>
    </occupant>
  </house>
</root>

我想计算(计算不是问题,xpath 的构造是问题,我将在末尾附加一个更准确但更难解释的示例)在处理 xslt 时前面的“表兄弟”

和以下 xslt (1.0)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
      <counts>
        <xsl:apply-templates select="root/house/occupant"/>
      </counts>
    </xsl:template>
  
    <xsl:template match="occupant">
      <previous>
        <xsl:value-of select="count(preceding::occupant)"/>
      </previous>
    </xsl:template>
</xsl:stylesheet>

我得到我想要的

<counts>
  <previous>0</previous>
  <previous>1</previous>
  <previous>2</previous>
  <previous>3</previous>
</counts>

但如果居住者可以出现在 xml 树的其他位置,则这不起作用,例如

<root>
  <house id="1">
    <occupant>
    </occupant>
    <occupant>
    </occupant>
    <next_door>
      <house id="2">
        <occupant>
        </occupant>
        <occupant>
        </occupant>
      </house>
    </next_door>
  </house>
  <house id="2">
    <occupant>
    </occupant>
    <occupant>
    </occupant>
  </house>
</root>

我对“next_door”不感兴趣,实际上我只对树中的“堂兄弟”(和兄弟姐妹)感兴趣,即路径“根/房屋/居住者”上的东西

以上将计算任何居住者,而前面的兄弟姐妹将仅计算兄弟姐妹。

我觉得我想数数

/root/house/occupant[一些谓词说这个节点在当前节点之前]


PS 实际问题更像是这样,即从特定表亲中提取数据(但解释输出非常复杂,其中计数很好且易于解释)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
      <counts>
        <xsl:apply-templates select="root/house/occupant"/>
      </counts>
    </xsl:template>
  
    <xsl:template match="occupant">
      <previous_and_next>
        <previous>
          <xsl:copy-of select="(preceding::occupant)[1]"/>
        </previous>
        <next>
          <xsl:copy-of select="(following::occupant)[1]"/>
        </next>
      </previous_and_next>
    </xsl:template>
</xsl:stylesheet>

标签: xsltxslt-1.0

解决方案


目前尚不清楚您到底想要什么。occupant从路径的上下文中,/root/house/occupant您可以使用以下命令选择同一路径上的先前居住者:

preceding-sibling::occupant | ../preceding-sibling::house/occupant"

推荐阅读