【问题标题】:xsl accessing top level nodesxsl 访问顶级节点
【发布时间】:2012-01-26 12:14:24
【问题描述】:

我有一个关于如何使用 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 行和第 3 行的元素单元格中获取第 1 行的 ID(即 Cell[Type='Main']/@Id)(第 1 行是第 2 行和第 3 行的父行)。 同样,我需要从第 5 行和第 6 行访问第 4 行的 ID(即 Cell[Type='Main']/@Id) (第 4 行是第 5 行和第 6 行的父行)。

我尝试使用 xsl:variables,但无法动态分配值。

请指教。提前致谢

【问题讨论】:

    标签: xslt variables


    【解决方案1】:

    这样的事情应该可以解决问题:

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

    【讨论】:

    • 但我需要逐行/单元格地进行,而不是一次。那时我怎么知道 Cell[@Type='Main']/@Id ?
    • 我不确定我是否理解您的评论。我的代码一一遍历“主要”行并查找匹配的两个“元素”行;那你为什么要写“not all at once”呢?
    • 现在,我没有遍历表格,而是一个一个地解析 Cell。好的,让我试试这个,看看它是否符合我们的要求
    【解决方案2】:

    在处理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]
    

    【讨论】:

    • 非常感谢...这适用于我在这里提到的结构,但我忘了再提一个条件。在某些情况下,不会有任何子元素。我现在更新了结构,请看第一行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多