Расширенный цикл XSL - PullRequest
       3

Расширенный цикл XSL

0 голосов
/ 06 марта 2020

Я хотел бы построить таблицу для каждой работы типа T. Эта таблица должна иметь 2 столбца (LPATH и RPATH). LPATH1 должен находиться в той же строке, что и RPATH1, et c ...

<ROOT>
    <FOLDER>
        <JOB type="T">
           <VARIABLE NAME="%%FTP-LPATH1" VALUE="/path/to/aL" />
           <VARIABLE NAME="%%FTP-RPATH1" VALUE="/path/to/aR" />
           <VARIABLE NAME="%%FTP-LPATH2" VALUE="/path/to/bL" />
           <VARIABLE NAME="%%FTP-RPATH2" VALUE="/path/to/bR" />
        </JOB>
        <JOB type="O" />
        <JOB type="T">
           <VARIABLE NAME="%%FTP-LPATH1" VALUE="/path/to/eL" />
           <VARIABLE NAME="%%FTP-RPATH1" VALUE="/path/to/eR" />
        </JOB>
    </FOLDER>
    <FOLDER>
        <JOB type="O" />
        <JOB type="T">
           <VARIABLE NAME="%%FTP-LPATH1" VALUE="/path/to/cL" />
           <VARIABLE NAME="%%FTP-RPATH1" VALUE="/path/to/cR" />
           <VARIABLE NAME="%%FTP-LPATH2" VALUE="/path/to/dL" />
           <VARIABLE NAME="%%FTP-RPATH2" VALUE="/path/to/dR" />
           <VARIABLE NAME="%%FTP-LPATH3" VALUE="/path/to/fL" />
           <VARIABLE NAME="%%FTP-RPATH3" VALUE="/path/to/fR" />
        </JOB>
        <JOB type="T">
           <VARIABLE NAME="%%FTP-RPATH5" VALUE="/path/to/kR" />
           <VARIABLE NAME="%%FTP-LPATH1" VALUE="/path/to/gL" />
           <VARIABLE NAME="%%FTP-RPATH1" VALUE="/path/to/gR" />
           <VARIABLE NAME="%%FTP-LPATH2" VALUE="/path/to/hL" />
           <VARIABLE NAME="%%FTP-RPATH2" VALUE="/path/to/hR" />
           <VARIABLE NAME="%%FTP-LPATH3" VALUE="/path/to/iL" />
           <VARIABLE NAME="%%FTP-RPATH3" VALUE="/path/to/iR" />
           <VARIABLE NAME="%%FTP-LPATH4" VALUE="/path/to/jL" />
           <VARIABLE NAME="%%FTP-RPATH4" VALUE="/path/to/jR" />
           <VARIABLE NAME="%%FTP-LPATH5" VALUE="/path/to/kL" />
        </JOB>
        <JOB type="O" />
    </FOLDER>
</ROOT>

, чтобы получить что-то вроде этого:

<table>
  <tr>
    <th>LPATH</th>
    <th>RPATH</th>
  </tr>
  <tr>
    <td>/path/to/aL</td>
    <td>/path/to/aR</td>
  </tr>
  <tr>
    <td>/path/to/bL</td>
    <td>/path/to/bR</td>
  </tr>
  ...

число пар RPATHx / LPATHx не определено

Что вы могли бы предложить?

С уважением

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Если они всегда идут как левая / правая пары, вы можете сделать следующее:

XSLT 1.0

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

<xsl:template match="/JOB">
    <table>
        <tr>
            <th>LPATH</th>
            <th>RPATH</th>
        </tr>
        <xsl:for-each select="VARIABLE[contains(@NAME, 'LPATH')]">
            <tr>
                <td>
                    <xsl:value-of select="@VALUE"/>
                </td>
                <td>
                    <xsl:value-of select="following-sibling::VARIABLE[1]/@VALUE"/>
                </td>
            </tr>
        </xsl:for-each>
    </table>    
</xsl:template>

</xsl:stylesheet>

или даже проще:

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

<xsl:template match="/JOB">
    <table>
        <tr>
            <th>LPATH</th>
            <th>RPATH</th>
        </tr>
        <xsl:for-each select="VARIABLE[position() mod 2 = 1]">
            <tr>
                <td>
                    <xsl:value-of select="@VALUE"/>
                </td>
                <td>
                    <xsl:value-of select="following-sibling::VARIABLE[1]/@VALUE"/>
                </td>
            </tr>
        </xsl:for-each>
    </table>    
</xsl:template>

</xsl:stylesheet>

Добавлено:

Если они могут выйти из строя, как показано в обновленном примере, попробуйте:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="r" match="VARIABLE[starts-with(@NAME, '%%FTP-RPATH')]" use="substring-after(@NAME, '%%FTP-RPATH')" />

<xsl:template match="/ROOT">
    <root>
        <xsl:for-each select="FOLDER/JOB[@type='T']">
            <xsl:variable name="job" select="." />
            <table>
                <tr>
                    <th>LPATH</th>
                    <th>RPATH</th>
                </tr>
                <xsl:for-each select="VARIABLE[starts-with(@NAME, '%%FTP-LPATH')]">
                    <tr>
                        <td>
                            <xsl:value-of select="@VALUE"/>
                        </td>
                        <td>
                            <xsl:value-of select="key('r', substring-after(@NAME, '%%FTP-LPATH'), $job)/@VALUE"/>
                        </td>
                    </tr>
                </xsl:for-each>
            </table>
        </xsl:for-each> 
    </root>  
</xsl:template>

</xsl:stylesheet>

Демо : https://xsltfiddle.liberty-development.net/6pS26mt


Обратите внимание, что это по-прежнему предполагает, что они идут парами - или, по крайней мере, что значение LPATH пары всегда будет присутствовать.

0 голосов
/ 06 марта 2020

Предполагая, что VARIABLE / @ NAME всегда содержат LPATHnnn и RPATHnnn в качестве имени:

<xsl:template match="/">
    <html>
        <table>
            <tr>
                <th>LPATH</th>
                <th>RPATH</th>
            </tr>
            <xsl:apply-templates select="JOB/VARIABLE[contains(@NAME,'LPATH')]"/>
        </table>
    </html>
  </xsl:template>

  <xsl:template match="VARIABLE">
      <tr>
        <th><xsl:value-of select="@VALUE"/></th>
        <xsl:variable name="Rname" select="replace(@NAME,'LPATH','RPATH')"/>
        <th><xsl:value-of select="//JOB/VARIABLE[@NAME=$Rname]/@VALUE"/></th>
      </tr>
  </xsl:template>

Смотрите, как это работает здесь: https://xsltfiddle.liberty-development.net/pNmC4HG

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...