как получить доступ к структуре переменных в for-each, чтобы создать лист Excel в XSLT - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть ввод, например:

<item id="CON_1985_14">
   <prv id="p1">
      <no>1</no>
      <text>This &quot;May&quot; take some moment, you &quot;shall&quot; not go there.</text>
      <text>This is ok.</text>
   </prv>
</item>

Необходимо создать таблицу Excel на основе значений в кавычках.

=========================
A                 B
=========================
May           CON_1985_14
shall         CON_1985_14
=========================

Создан XSLT для генерации вывода Excel, например:

<Worksheet ss:Name="R6">
   <Table>
      <Row>
         <Cell>
            <Data ss:Type="String">
               <xsl:text>A</xsl:text>
            </Data>
         </Cell>
         <Cell>
            <Data ss:Type="String">
               <xsl:text>B</xsl:text>
            </Data>
         </Cell>
      </Row>
      <xsl:for-each select="$path">
         <xsl:for-each select="descendant::prv//descendant::text">
            <xsl:variable name="STRUCTUREONBASISOFTOKENS" as="node()">
               <Report>
                  <dd>
                     <xsl:for-each select="tokenize(normalize-space(.), '(&quot;|&#x201C;)')">
                        <xsl:if test="(position() gt 1) and (position() mod 2 = 0)">
                           <xsl:value-of select="normalize-space(.)"/>
                           <xsl:if test="position() ne (last() - 1)">
                              <xsl:text>, </xsl:text>
                           </xsl:if>
                        </xsl:if>
                     </xsl:for-each>
                  </dd>
                  <LID>
                     <xsl:value-of select="/item/@id"/>
                  </LID>
               </Report>
            </xsl:variable>

            <xsl:for-each select="tokenize($STRUCTUREONBASISOFTOKENS/Report/dd, ',')">
               <Row>
                  <Cell>
                     <Data ss:Type="String">
                        <xsl:value-of select="normalize-space(.)"/>
                     </Data>
                  </Cell>
                  <Cell>
                     <Data ss:Type="String">
                        <xsl:value-of select="$STRUCTUREONBASISOFTOKENS/Report/LID"/>
                     </Data>
                  </Cell>
               </Row>
            </xsl:for-each>
         </xsl:for-each>
      </xsl:for-each>
   </Table>
</Worksheet>

Переменная, созданная внутри for-each с выводом, напечатанным в сообщении, например:

<Report xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:LxNx="http://www.LXNX.com"
   xmlns="urn:schemas-microsoft-com:office:spreadsheet"
   xmlns:dict="http://www.lexis-nexis.com/glp/dict" xmlns:ci="http://www.lexis-nexis.com/ci"
   xmlns:o="urn:schemas-microsoft-com:office:office"
   xmlns:x="urn:schemas-microsoft-com:office:excel"
   xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
   <dd>May, shall</dd>
   <LID>CON_1985_14</LID>
</Report>

Теперь вложенный for-each, чуть ниже определения переменной, пытается извлечь значения из переменнойструктура для генерации строк, но не удалась. Не удалось извлечь значения из переменной по xpath для генерации строки. Этот синтаксис '' означает путь к коллекции ().

Укажите подходящее решение для этого.

1 Ответ

1 голос
/ 05 ноября 2019

Я не мог следовать логике вашей попытки XSLT. Рассмотрим следующий упрощенный пример:

XML

<input>
    <item>Lorem ipsum "alpha" dolor sit amet, consectetur "bravo" adipiscing elit "charlie".</item>
    <item>"Delta" sed do eiusmod tempor "echo" incididunt ut labore et dolore magna aliqua.</item>
</input>

XSLT 2.0

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

<xsl:template match="/input">
    <table>
        <xsl:for-each select="item">
            <xsl:analyze-string select="." regex="&quot;(.*?)&quot;">
                <xsl:matching-substring>
                    <row>
                        <cell>
                            <xsl:value-of select="regex-group(1)" />
                        </cell>
                    </row>
                </xsl:matching-substring>
            </xsl:analyze-string>
        </xsl:for-each>
    </table>
</xsl:template>

</xsl:stylesheet>

Результат

<?xml version="1.0" encoding="UTF-8"?>
<table>
   <row>
      <cell>alpha</cell>
   </row>
   <row>
      <cell>bravo</cell>
   </row>
   <row>
      <cell>charlie</cell>
   </row>
   <row>
      <cell>Delta</cell>
   </row>
   <row>
      <cell>echo</cell>
   </row>
</table>

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

...