2014-11-20 257 views
0

我该如何在xsl中实现这一点?我曾尝试与apply-templates一起使用它,但我没有运气。引用不同的兄弟节点

的test.xml

<row> 
    <table name="Person"> 
     <tuple> 
      <val>BOB</val> 
      <val>BILL</val> 
     </tuple> 
    </table> 
    <table name="Age"> 
     <tuple> 
      <val>18</val> 
      <val>21</val> 
     </tuple> 
    </table> 
</row> 

所需的输出

<row> 
    <data> 
     <name>BOB</name> 
     <age>18</age> 
    </data> 
    <data> 
     <name>BILL</name> 
     <age>21</age> 
    </data> 
</row> 

回答

1

这可以实现另一种方式是通过使用xsl:key基于自己的立场来查找val元素

<xsl:key name="values" match="val" use="count(preceding-sibling::val)" /> 

这样,你会遍历val元素在第一table

<xsl:for-each select="table[1]/tuple/val"> 

然后,您可以使用关键字

获取将构成 data元素的所有 val元素0
<xsl:apply-templates select="key('values', position() - 1)" /> 

唯一真正的混乱点是你如何映射name属性“Person”来输出一个“name”元素。

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="values" match="val" use="count(preceding-sibling::val)" /> 

    <xsl:template match="/row"> 
     <row> 
      <xsl:for-each select="table[1]/tuple/val"> 
       <data> 
        <xsl:apply-templates select="key('values', position() - 1)" /> 
       </data> 
      </xsl:for-each> 
     </row> 
    </xsl:template> 

    <xsl:template match="val"> 
     <xsl:variable name="name"> 
      <xsl:choose> 
       <xsl:when test="../../@name = 'Person'">name</xsl:when> 
       <xsl:otherwise><xsl:value-of select="translate(../../@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" /></xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
     <xsl:element name="{$name}"> 
      <xsl:value-of select="." /> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

除了凌乱xsl:choose这种解决方案也相当一般。

1

我不知道做一个解构绑定XSL的任何方式;我有兴趣知道是否有一个原生的成语。

总之:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/row"> 
    <row> 
    <xsl:for-each select="table[@name='Person']/tuple/val"> 
    <xsl:variable name="i" select="position()" /> 
    <data> 
     <name><xsl:value-of select="." /></name> 
     <age><xsl:value-of select="../../../table[@name='Age']/tuple/val[position()=$i]" /></age> 
    </data> 
    </xsl:for-each> 
    </row> 
</xsl:template> 

</xsl:stylesheet> 

诚然不是最漂亮的XSL样式表摆在那里,但它的伎俩。

当然,假设每个名称条目都有匹配的年龄条目。如果您的姓名和年龄条目在原始XML文档中通过id进行交叉引用,那将会有很大的帮助。

相关问题