XSL доступ к узлам верхнего уровня - PullRequest
2 голосов
/ 23 декабря 2011

У меня есть вопрос о том, как получить доступ к узлам из XML с помощью XSL.

У меня есть такой xml:

<Table>
<Row>
   <Cell Type="Main" Id="980">Test22</Cell>
   <Cell Type="SubElement">Test22 Sub Element1</Cell>
</Row>
<Row>
   <Cell Type="Main" Id="123">Test</Cell>
   <Cell/>
</Row>
<Row>
   <Cell Type="SubElement">Test Sub Element1</Cell>
   <Cell Type="Element">xyz</Cell>
</Row>
<Row>
   <Cell Type="SubElement">Test Sub Element2</Cell>
   <Cell Type="Element">abc</Cell>
</Row>
<Row>
   <Cell Type="Main" Id="456">Test1</Cell>
   <Cell/>
</Row>
<Row>
   <Cell Type="SubElement">Test1 Sub Element1</Cell>
   <Cell Type="Element">awe</Cell>
</Row>
<Row>
   <Cell Type="SubElement">Test1 Sub Element2</Cell>
   <Cell Type="Element">scd</Cell>
</Row>
</Table>

Теперь мне нужно получить идентификатор 1-й строки (то есть ячейка [Type = 'Main'] / @ Id) из элементной ячейки 2-й и 3-й строк (1-й ряд является родительским для 2-го и 3-го ряда). Точно так же мне нужно получить доступ к идентификатору 4-й строки (т.е. ячейке [Type = 'Main'] / @ Id) из 5-й и 6-й строк (4-я строка является родительской строкой для 5-й и 6-й строки).

Я пытался использовать переменные xsl:, но я не мог назначать значения динамически.

Пожалуйста, сообщите. Заранее спасибо

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Используйте следующее выражение в шаблоне, который обрабатывает SubElement или Element:

../preceding-sibling::Row[Cell/@Type='Main'][1]/Cell/@Id

Например:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*" />
    <xsl:template match="Cell[@Type[.='SubElement' or .='Element']]">
        [<xsl:value-of select="concat(., '; Parent ID: ',
                ../preceding-sibling::Row[Cell/@Type='Main'][1]/Cell/@Id)"/>]
    </xsl:template>
    <xsl:template match="Cell"/>
</xsl:stylesheet>

Выходы (пробелы удалены):

[Test Sub Element1; Parent ID: 123]
[xyz; Parent ID: 123]
[Test Sub Element2; Parent ID: 123]
[abc; Parent ID: 123]
[Test1 Sub Element1; Parent ID: 456]
[awe; Parent ID: 456]
[Test1 Sub Element2; Parent ID: 456]
[scd; Parent ID: 456]
0 голосов
/ 23 декабря 2011

Примерно так должно получиться:

<xsl:template match="Table">
  <xsl:foreach select="Row[Cell/@Type='Main']">
    Id: <xsl:value-of select="Cell[@Type='Main']/@Id" />
    Element 1: <xsl:value-of select="following-sibling::Row[Cell/@Type='Element'][1]" />
    Element 2: <xsl:value-of select="following-sibling::Row[Cell/@Type='Element'][2]" />
  </xsl:for-each>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...