2014-11-20 123 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進行交叉引用,那將會有很大的幫助。