2011-12-22 2 views
2

У меня вопрос о том, как получить доступ к узлам из XML с помощью XSL.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> 

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

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

Просьба сообщить. Заранее спасибо

ответ

1

Используйте следующее выражение в шаблоне, который обрабатывает 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

Большое спасибо ... Это работает для структуры, о которой я упоминал здесь, но забыл упомянуть еще одно условие. В некоторых случаях не будет никаких подэлементов. Теперь я обновил структуру, посмотрю первую строку. – user972255

0

Что-то вроде этого следует сделать трюк:

<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> 
+0

Но мне нужно продолжить Row/cell by Row/cell не все сразу. В то время, как я знаю Cell [@ Type = 'Main']/@ Id? – user972255

+0

Я не уверен, что понимаю ваш комментарий. Мой код проходит по строкам «Main» один за другим и ищет соответствующие две строки «Элемент»; так почему вы пишете «не все сразу»? – Lucero

+0

Прямо сейчас, я не зацикливаюсь по столу, но я разбираю Cell один за другим. Хорошо, позвольте мне попробовать это и посмотреть, подходит ли это для нашего требования. – user972255

Смежные вопросы