2014-11-20 3 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, используя ключ

<xsl:apply-templates select="key('values', position() - 1)" /> 

Единственный реальный беспорядочный бит - это то, как вы сопоставляете атрибут «Лицо» name, чтобы вывести элемент «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 таблицы стилей там, но это делает трюк.

Конечно, предполагается, что каждая запись названия имеет соответствующую возрастную запись здесь. Это очень поможет, если ваши имена и возрастные записи перекрестно ссылаются на id в исходном документе XML.

Смежные вопросы