Как соотнести разные типы узлов в преобразовании XML - PullRequest
0 голосов
/ 11 октября 2018

У меня есть два разных типа узлов (модель и цвет) в одном XML-файле, как показано ниже:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="fwHtml.xsl"?>
<vehicle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <model>
        <modelID>508560-003</modelID>
        <modelName>Compact</modelName>
        <paintID>511258-008</paintID>
    </model>
    <model>
        <modelID>210588-003</modelID>
        <modelName>Convertible</modelName>
        <paintID>511354-001</paintID>
      <paintID>511353-003</paintID>
    </model>
    <model>
        <modelID>210588-004</modelID>
        <modelName>SUV</modelName>
        <paintID>511354-001</paintID>
        <paintID>511353-004</paintID>
    </model>
    <model>
        <modelID>209545-001</modelID>
        <modelName>Pickup</modelName>
        <paintID>511231-000</paintID>
        <paintID>511232-001</paintID>
    </model>

    <color>
        <paintID>511354-001</paintID>
        <paintName>White</paintName>
        <paintVersion>151.1002</paintVersion>
    </color>
    <color>
        <paintID>511353-003</paintID>
        <paintName>Blue</paintName>
        <paintVersion>152.1002</paintVersion>
    </color>
    <color>
        <paintID>511353-004</paintID>
        <paintName>Brown</paintName>
        <paintVersion>152.1002</paintVersion>
    </color>
    <color>
        <paintID>511258-008</paintID>
        <paintName>Black</paintName>
        <paintVersion>152.1013</paintVersion>
    </color>
    <color>
        <paintID>511231-000</paintID>
        <paintName>Gray</paintName>
        <paintVersion>200.1003</paintVersion>
    </color>
    <color>
        <paintID>511232-001</paintID>
        <paintName>Red</paintName>
        <paintVersion>101.1012</paintVersion>
    </color>
</vehicle>

Я пытаюсь создать список доступных вариантов цвета для каждой модели с помощью преобразования XML, котороедолжно выглядеть следующим образом:

Desired Output

Я использую следующее для преобразования XML:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>Released Paint Versions</h2>
  <table border="1">
    <tr bgcolor="#56a0d3">
      <th>Model ID</th>
      <th>Model Description</th>
      <th>Paint ID</th>
      <th>Paint Description</th>
    </tr>
    <xsl:for-each select="vehicle/model">
      <xsl:for-each select="paintID">
         <tr>
         <td><xsl:value-of select="../modelID"/></td>
         <td><xsl:value-of select="../modelName"/></td>
         <td><xsl:value-of select="."/></td>

         <xsl:for-each select="/vehicle/color">
            <xsl:if test="contains(./paintID,5113)">
              <td><xsl:value-of select="./paintName"/></td>
            </xsl:if>
         </xsl:for-each>

         </tr>
      </xsl:for-each>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet> 

Это меняблизко, но я не могу понять, как создать связь между элементом paintID в узлах модели и элементами paintID в узлах цвета, поэтому я получаю следующее: не совсем то, что мне нужно:

Wrong but close output

Линия

<xsl:if test="contains(./paintID,5113)">

, очевидно, не верна, но я ближе всего подхожу к тому, чтобы выяснить, как создать модель / paintID <-> Соотношение цвет / краска.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Я бы использовал xsl:key и функцию «ключ», это будет более эффективно:

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

  <xsl:key name="color" match="color" use="paintID"/>

  <xsl:template match="/">
    <html>
      <body>
        <h2>Released Paint Versions</h2>
        <table border="1">
          <tr bgcolor="#56a0d3">
            <th>Model ID</th>
            <th>Model Description</th>
            <th>Paint ID</th>
            <th>Paint Description</th>
          </tr>
          <xsl:apply-templates select="vehicle/model/paintID"/>
        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="paintID">
    <tr>
      <td>
        <xsl:value-of select="../modelID"/>
      </td>
      <td>
        <xsl:value-of select="../modelName"/>
      </td>
      <td>
        <xsl:value-of select="."/>
      </td>
      <td>
        <xsl:value-of select="key('color', .)/paintName"/>
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>
0 голосов
/ 11 октября 2018

В цикле paintID сохраните ток в переменной как:

<xsl:variable name="curr_ID" select="."/>

Затем измените ваше условие на:

<xsl:if test="paintID=$curr_ID">

Ниже приведена измененная таблица стилей:

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

    <xsl:template match="/">
        <html>
            <body>
                <h2>Released Paint Versions</h2>
                <table border="1">
                    <tr bgcolor="#56a0d3">
                        <th>Model ID</th>
                        <th>Model Description</th>
                        <th>Paint ID</th>
                        <th>Paint Description</th>
                    </tr>
                    <xsl:for-each select="vehicle/model">
                        <xsl:for-each select="paintID">
                            <xsl:variable name="curr_ID" select="."/>
                            <tr>
                                <td><xsl:value-of select="../modelID"/></td>
                                <td><xsl:value-of select="../modelName"/></td>
                                <td><xsl:value-of select="."/></td>

                                <xsl:for-each select="/vehicle/color">
                                    <xsl:if test="paintID=$curr_ID">
                                        <td><xsl:value-of select="./paintName"/></td>
                                    </xsl:if>
                                </xsl:for-each>

                            </tr>
                        </xsl:for-each>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet> 
...