xsl访问顶级节点

时间:2011-12-22 23:40:06

标签: xslt variables

我有一个关于如何使用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但我无法动态分配值。

请指教。提前致谢

2 个答案:

答案 0 :(得分:1)

在处理SubElementElement的模板中使用以下表达式:

../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>