XSLT - изменение XPATH для каждого - PullRequest
0 голосов
/ 03 марта 2019

Мое первое сообщение здесь, я надеюсь, я сделаю это правильно!Любая помощь или конструктивная помощь (я начинающий) приветствуется!У меня есть продукт, который может иметь 2 разных имени + некоторые другие свойства.Я хотел иметь в строке для каждого основного и второго возможных имен.

Я вызвал шаблон для отображения основного имени и еще один для вызова свойств продукта, без проблем, так как узлы совпадают "level ".

Затем я хотел вызвать второй шаблон, чтобы отобразить в одной строке каждое второе возможное имя для каждого продукта, а затем вызвать шаблон свойств, проблема в том, что я не могу вернуться к родительским узламодин раз в функции «для каждого».

XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="SOF.xsl" ?>

<root>
    <intrants>
        <CCCs>
            <PPP>
                <nbID>01</nbID>
                <product-name>MainNameA</product-name>
                <int-composition>
                    <act-subs>
                        <act-sub>
                            <substance ref-type="substance" ref-id="00000000000000000001">subA</substance>
                            <variant>
                                <name>substanceA</name>
                            </variant>
                            <AS-concentration unite-id="10000000000000000001" unite="g/L">123.0</AS-concentration>
                        </act-sub>
                    </act-subs>
                </int-composition>
            </PPP>
            <PPP>
                <nbID>02</nbID>
                <product-name>MainNameB</product-name>
                <others-names> </others-names>
                <int-composition>
                    <act-subs>
                        <act-sub>
                            <substance ref-type="substance" ref-id="00000000000000000001">subA</substance>
                            <variant>
                                <name>substanceA</name>
                            </variant>
                            <AS-concentration unite-id="10000000000000000001" unite="g/L">123.0</AS-concentration>
                        </act-sub>
                    </act-subs>
                </int-composition>
            </PPP>
            <PPP>
                <nbID>03</nbID>
                <product-name>MainNameC</product-name>
                <others-names>
                    <other-name>
                        <type-name ref-type="type-name" ref-id="20150522093431975033" lib-court="SEC">Second name</type-name>
                        <name>SecondNameC</name>
                    </other-name>
                </others-names>
                <int-composition>
                    <act-subs>
                        <act-sub>
                            <substance ref-type="substance" ref-id="00000000000000000001">subA</substance>
                            <variant>
                                <name>substanceA</name>
                            </variant>
                            <AS-concentration unite-id="10000000000000000001" unite="g/L">123.0</AS-concentration>
                        </act-sub>
                    </act-subs>
                </int-composition>
            </PPP>
            <PPP>
                <nbID>04</nbID>
                <product-name>MainNameD</product-name>
                <others-names>
                    <other-name>
                        <type-name ref-type="type-name" ref-id="20150522093431975033" lib-court="SEC">Second name</type-name>
                        <name>SecondName1D</name>
                    </other-name>
                    <other-name>
                        <type-name ref-type="type-name" ref-id="20150522093431975033" lib-court="SEC">Second name</type-name>
                        <name>SecondName2D</name>
                    </other-name>
                </others-names>
                <int-composition>
                    <act-subs>
                        <act-sub>
                            <substance ref-type="substance" ref-id="00000000000000000001">subA</substance>
                            <variant>
                                <name>substanceA</name>
                            </variant>
                            <AS-concentration unite-id="10000000000000000001" unite="g/L">123.0</AS-concentration>
                        </act-sub>
                        <act-sub>
                            <substance ref-type="substance" ref-id="00000000000000000002">subB</substance>
                            <variant>
                                <name>substanceB</name>
                            </variant>
                            <AS-concentration unite-id="10000000000000000001" unite="g/kg">456.0</AS-concentration>
                        </act-sub>
                        <act-sub>
                            <substance ref-type="substance" ref-id="00000000000000000003">subC</substance>
                            <variant>
                                <name>substanceC</name>
                            </variant>
                            <AS-concentration unite-id="10000000000000000001" unite="%/L">678.0</AS-concentration>
                        </act-sub>
                    </act-subs>
                </int-composition>
            </PPP>
        </CCCs>
    </intrants>
</root>

XLM:

<?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>
            <head>
                <title>Rep</title>
            </head>
            <body>
                <table style="width:100%">

                    <tr>
                        <th>Name</th>
                        <th>ID</th>
                        <th>Composition</th>
                    </tr>

                    <xsl:for-each select="root/intrants/CCCs/PPP">
                        <tr>
                            <xsl:call-template name="displayMN">
                            <xsl:with-param name="MN" select="." />
                        </xsl:call-template>
                        </tr>
                    </xsl:for-each>

                    <xsl:for-each select="/root/intrants/CCCs/PPP">
                        <xsl:if test="count(others-names/other-name) &gt; 0">
                            <xsl:for-each select="others-names/other-name/name">
                                <tr>
                                        <xsl:call-template name="displaySN">
                                            <xsl:with-param name="SN" select="/root/intrants/CCCs/PPP"/>
                                        </xsl:call-template>
                                </tr>
                            </xsl:for-each>
                        </xsl:if>
                    </xsl:for-each>

                </table>
            </body>
        </html>
    </xsl:template>

    <!-- Main Product -->

    <xsl:template name="displayMN">
        <xsl:param name="MN"/>
        <td>
            <xsl:call-template name="displayMainName">
                <xsl:with-param name="name" select="product-name"/>
            </xsl:call-template>
        </td>

        <xsl:call-template name="displayCore">
            <xsl:with-param name="Produit" select="."/>
        </xsl:call-template>

    </xsl:template>

    <!-- Second Product -->

    <xsl:template name="displaySN">
        <xsl:param name="SN"/>
        <td>
            <xsl:call-template name="displaySecondName">
                <xsl:with-param name="name" select="."/>
            </xsl:call-template>
        </td>

        <xsl:call-template name="displayCore">
            <xsl:with-param name="Produit" select="."/>
        </xsl:call-template>

    </xsl:template>

    <!-- Core -->
    <xsl:template name="displayCore">
        <xsl:param name="Produit"/>

        <td>
            <xsl:call-template name="displaynbID">
                <xsl:with-param name="nbID" select="nbID"/>
            </xsl:call-template>
        </td>

        <td>
            <xsl:call-template name="displayCompositionEN">
                <xsl:with-param name="Composition" select="."/>
            </xsl:call-template>
        </td>

    </xsl:template>

    <!-- Main Name -->

    <xsl:template name="displayMainName">
        <xsl:param name="name"/>
        <xsl:value-of select="$name"/>
    </xsl:template>

    <!-- Second Name -->

    <xsl:template name="displaySecondName">
        <xsl:param name="name"/>
        <xsl:value-of select="$name"/>
    </xsl:template>


    <!-- IDnb -->

    <xsl:template name="displaynbID">
        <xsl:param name="nbID"/>
        <xsl:value-of select="$nbID"/>
    </xsl:template>


    <!-- Composition EN -->

    <xsl:template name="displayCompositionEN">
        <xsl:param name="Composition"/>
        <xsl:for-each select="int-composition/act-subs/act-sub">
            <xsl:call-template name="displaySubstanceEN">
                <xsl:with-param name="AS" select="substance"/>
                <xsl:with-param name="SACc" select="AS-concentration"/>
            </xsl:call-template>
            <xsl:if test="position() != last()">
                <xsl:text> + </xsl:text>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

    <!-- Substance EN-->

    <xsl:template name="displaySubstanceEN">
        <xsl:param name="AS"/>
        <xsl:param name="SACc"/>
        <xsl:value-of select="$AS"/>&#160;<xsl:value-of select="$SACc"/>&#160;<xsl:value-of select="$SACc/@unite"/>
    </xsl:template>

</xsl:stylesheet>

Как вы можете видеть в результате преобразования, я могу 'Информация о свойствах:

Result

1 Ответ

0 голосов
/ 05 марта 2019

Я предполагаю, что, например, в строке, содержащей SecondNameC , в остальных столбцах должны отображаться те же значения, что и для MainNameC , то есть 03 и subA 123.0 g/L.

Сценарий, приведенный ниже, выполняет работу:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" doctype-public="-//W3C//DTD XHTML 1.1//EN"
    doctype-system= "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>

  <xsl:template match="/">
    <html>
      <head><title>Rep</title></head>
      <body>
        <table style="width:80%" border="1">
          <tr><th>Name</th><th>ID</th><th>Composition</th></tr>
          <xsl:for-each select="root/intrants/CCCs/PPP">
            <tr>
              <xsl:call-template name="displayMN">
                <xsl:with-param name="MN" select="." />
              </xsl:call-template>
            </tr>
          </xsl:for-each>
          <xsl:for-each select="root/intrants/CCCs/PPP">
            <xsl:variable name="MN" select="."/>
            <xsl:if test="count(others-names/other-name) &gt; 0">
              <xsl:for-each select="others-names/other-name/name">
                <tr>
                  <xsl:call-template name="displaySN">
                    <xsl:with-param name="MN" select="$MN"/>
                  </xsl:call-template>
                </tr>
              </xsl:for-each>
            </xsl:if>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>

  <!-- Main Product -->
  <xsl:template name="displayMN">
    <xsl:param name="MN"/>
    <td>
      <xsl:call-template name="displayMainName">
        <xsl:with-param name="name" select="product-name"/>
      </xsl:call-template>
    </td>
    <xsl:call-template name="displayCore">
      <xsl:with-param name="Produit" select="."/>
    </xsl:call-template>
  </xsl:template>

  <!-- Second Product -->
  <xsl:template name="displaySN">
    <xsl:param name="MN"/>
    <td>
      <xsl:call-template name="displaySecondName">
        <xsl:with-param name="name" select="."/>
      </xsl:call-template>
    </td>
    <xsl:call-template name="displayCore">
      <xsl:with-param name="Produit" select="$MN"/>
    </xsl:call-template>
  </xsl:template>

  <!-- Core -->
  <xsl:template name="displayCore">
    <xsl:param name="Produit"/>
    <td>
      <xsl:call-template name="displaynbID">
        <xsl:with-param name="nbID" select="$Produit/nbID"/>
      </xsl:call-template>
    </td>
    <td>
      <xsl:call-template name="displayCompositionEN">
        <xsl:with-param name="Composition" select="$Produit"/>
      </xsl:call-template>
    </td>
  </xsl:template>

  <!-- Main Name -->
  <xsl:template name="displayMainName">
    <xsl:param name="name"/>
    <xsl:value-of select="$name"/>
  </xsl:template>

  <!-- Second Name -->
  <xsl:template name="displaySecondName">
    <xsl:param name="name"/>
    <xsl:value-of select="$name"/>
  </xsl:template>

  <!-- IDnb -->
  <xsl:template name="displaynbID">
    <xsl:param name="nbID"/>
    <xsl:value-of select="$nbID"/>
  </xsl:template>

  <!-- Composition EN -->
  <xsl:template name="displayCompositionEN">
    <xsl:param name="Composition"/>
    <xsl:for-each select="$Composition/int-composition/act-subs/act-sub">
      <xsl:call-template name="displaySubstanceEN">
        <xsl:with-param name="AS" select="substance"/>
        <xsl:with-param name="SACc" select="AS-concentration"/>
      </xsl:call-template>
      <xsl:if test="position() != last()">
        <xsl:text> + </xsl:text>
  </xsl:if>
    </xsl:for-each>
  </xsl:template>

  <!-- Substance EN-->
  <xsl:template name="displaySubstanceEN">
    <xsl:param name="AS"/>
    <xsl:param name="SACc"/>
    <xsl:value-of select="$AS"/>&#160;<xsl:value-of select="$SACc"/>&#160;<xsl:value-of select="$SACc/@unite"/>
  </xsl:template>
</xsl:stylesheet>

Рабочий пример см. http://xsltransform.net/asnmyT

Я вижу, что вы забыли, что элемент контекста изменился, например, в for-each loop.

Обратите внимание, что я изменил шаблон displaySN .Он содержит параметр MN, относящийся к элементу "main" (PPP).

Также есть некоторые изменения в шаблоне displayCompositionEN .

Я также добавил xsl:output элемент с doctype-public и doctype-system атрибутами для генерации вывода XHTML, чтобы получить представление HTML на xsltransform тестовом сайте.Но если вам это не нужно, просто удалите его.

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