我有一个关于如何使用XSL从XML访问节点的问题。
我有一个像这样的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>
现在,我需要获得第2行的Id(即Cell [Type ='Main'] / @ Id)第3行的元素单元格(第1行是第2行和第3行的父行)。 类似地,我需要从第5行和第5行访问第4行的Id(即Cell [Type ='Main'] / @ Id)。第六排 (第4行是第5行和第6行的父行。)
我尝试使用xsl:variables但我无法动态分配值。
请指教。提前致谢
答案 0 :(得分: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]
答案 1 :(得分: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>