#xslt
#xslt
Вопрос:
Как получить доступ к дочернему узлу родительского узла 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 мне нужно, чтобы наблюдение было напечатано. Для первого 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:
ваша проблема в том, что все ваши запросы 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>
Комментарии:
1. 🙂 Спасибо, Колин. Я думаю, что я пропустил .. / ../ НАБЛЮДЕНИЯ /OBSERVATION. Спасибо за помощь. 1 к ответу 🙂
2. Нет проблем. Если это отвечает на ваш вопрос, вы должны пометить его как ответ, щелкнув символ «галочки».