Доступ к дочернему элементу другого узла из дочернего узла в XSLT - PullRequest
2 голосов
/ 02 мая 2011

Как получить доступ к дочернему узлу родителя 1 из дочернего узла родителя 2 в XSLT?

<Test>
    <SOLUTIONS>
        <SOLUTION>
            <OBSERVATIONS>
                <OBSERVATION Key = "1ASED">A1</OBSERVATION>
                <OBSERVATION Key = "2DFED">A2</OBSERVATION>
                <OBSERVATION Key = "3DGEE">A3</OBSERVATION>
            </OBSERVATIONS>
            <ITRs>
                <ITR Key = "ASE1">P1</ITR>
                <ITR Key = "GGEE1">P2</ITR>
                <ITR Key = "GERFECE1">P3</ITR>
            </ITRs>
        </SOLUTION>
        <SOLUTION>
            <OBSERVATIONS>
                <OBSERVATION Key = "ABCD">A1</OBSERVATION>
                <OBSERVATION Key = "EFGH">A2</OBSERVATION>
                <OBSERVATION Key = "IJKL">A3</OBSERVATION>
            </OBSERVATIONS>
            ...
        </SOLUTION>
    </SOLUTIONS>
</Test>

Для каждого ITR мне нужно распечатать наблюдение.Для Первой ИТР внутри я должен связать Ключ этого с Ключом Наблюдения.Итак, всего нужно отобразить 9 записей.

Мой XSLT равен

<xsl:for-each select="/Test/SOLUTIONS/SOLUTION">
    <xsl:for-each select="ITRs/ITR">
      <xsl:variable name="Key_ITRPS" select="@Key"/>
      <xsl:for-each select="/Test/SOLUTIONS/SOLUTION/OBSERVATIONS/OBSERVATION">
            <xsl:variable name="srcKey_A" select="@Key"/>
            <xsl:element name="Relationship">
                <xsl:attribute name="RelCommonKey">
                    <xsl:value-of select="concat($Key_ITRPS,$srcKey_A)"/>
                </xsl:attribute>
            </xsl:element>
      </xsl:for-each>
    </xsl:for-each>
</xsl:for-each>

Требуемый вывод:

 RelCommonKey

 ASE11ASED
 ASE12DFED
 ASE13DGEE

 GGEE11ASED
 GGEE12DFED
 GGEE13DGEE

 GERFECE11ASED
 GERFECE12DFED
 GERFECE13DGEE

Проблема, с которой я столкнулся здесь, связана свышеупомянутые данные, я вечером замечаю Ключ Наблюдения во втором также.

ключ ITR "ASE1" также связан с "ABCD," EFGH "," IJKL ". Пожалуйста, помогите мне ограничить данные, как показано выше.

1 Ответ

2 голосов
/ 02 мая 2011

ваша проблема в том, что все ваши XPath-запросы все «привязаны» к корневому узлу, «/ Test», вместо этого вам нужно использовать текущий контекст и «родительскую» ось XPath, чтобы перемещаться от элемента ITR к НАБЛЮДЕНИЯ в том же решении. Следующий XSLT дает требуемый вывод:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" />

  <xsl:template match="/">
    <xsl:apply-templates select="//SOLUTION"/>
  </xsl:template>

  <xsl:template match="SOLUTION">
    <!-- iterat over the ITRs for this solution -->
    <xsl:for-each select="ITRs/ITR">
      <xsl:variable name="Key_ITRPS" select="@Key"/>
      <!-- iterate over the observations -->
      <xsl:for-each select="../../OBSERVATIONS/OBSERVATION">
        <!-- the ITR Key -->
        <xsl:value-of select="$Key_ITRPS"/>
        <!-- the related observation -->
        <xsl:value-of select="@Key"/>
        <!-- a newline -->
        <xsl:text>
        </xsl:text>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...