Как получить доступ к дочернему элементу предыдущего брата из предка текущего узла в xslt 1.0 - PullRequest
0 голосов
/ 09 марта 2020

У меня есть вопрос относительно использования оси Xpath для получения значения узла от предыдущего родственного брата предка текущего узла. В следующем коде, скажем, я сейчас нахожусь в "g_place id =" 3 "" группы id = "1". Моя цель - сравнить все узлы "g_place" группы id = "0" с узлом "g_place id =" 3 ".

<conflict id="22">
    <group id="0">
      <g_priority>1</g_priority>
      <g_transition id="9"/>
      <g_place id="2">
        <g_arc id="12"/>
      </g_place>
      <g_place id="3">
        <g_arc id="13"/>
      </g_place>
    </group>
    <group id="1">
      <g_priority>2</g_priority>
      <g_transition id="10"/>
      <g_place id="3">
        <g_arc id="14"/>
      </g_place>
      <g_place id="4">
        <g_arc id="15"/>
      </g_place>
    </group>
    <group id="2">
      <g_priority>3</g_priority>
      <g_transition id="11"/>
      <g_place id="4">
        <g_arc id="16"/>
      </g_place>
      <g_place id="5">
        <g_arc id="17"/>
      </g_place>
    </group>
  </conflict>

Я уже пробовал решение, но оно не работает

 <xsl:for-each select="key('conflict', $conflict_id)/group">
    <xsl:sort select="g_priority" order="ascending" data-type="number" />
    <xsl:choose>
     <xsl:when test="position() = 1">
       <xsl:text>          If </xsl:text>
     </xsl:when>
     <xsl:otherwise>
       <xsl:for-each select="./g_place">
         <xsl:variable name="place_id" select="@id" />
         <xsl:choose>
     <xsl:when test="preceding-sibling::group[1]/g_place/attribute::id = $place_id">
            <xsl:text>          Elsif </xsl:text>
         </xsl:when>     
         <xsl:otherwise>
            <xsl:text>          If </xsl:text>
         </xsl:otherwise>
        <xsl:choose>
      </xsl:for-each>      
    </xsl:otherwise>
    </xsl:choose>

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

когда вы используете

<xsl:for-each select="./g_place">

, теперь вы находитесь в контексте g_place. Чтобы получить доступ к предыдущему group, вы можете использовать

<xsl:when test="../preceding-sibling::group[1]/g_place/attribute::id = $place_id">

../, что означает parent::*. Или вы можете использовать preceding ось

<xsl:when test="preceding::group[1]/g_place/attribute::id = $place_id">
0 голосов
/ 09 марта 2020

Удалите «родного брата» и добавьте «/» в XPath:

//group[@id="1"]//g_place[@id="3"]/preceding::group[1]//g_place

возвращает 2 узла.

...