xslt группировка через другой узел - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть следующий xml

 <root xmlns="">
<General>
  <Data>
    <Number>123456</Number>
    <Date>2018-10-22</Data>
    <LineRefer>0001</LineRefer>
    <LineRefer>0002</LineRefer>
  </Data>
  <Data>
    <Number>789456</Number>
    <Date>2018-10-22</Data>
    <LineRefer>0003</LineRefer>
    <LineRefer>0004</LineRefer>
  </Data>
</General>
<Services>
  <Details>
    <LineNumber>0001</LineNumber>
    <Description>test description</Description>
  </Details>
  <Details>
    <LineNumber>0002</LineNumber>
    <Description>test description</Description>
  </Details>
  <Details>
    <LineNumber>0003</LineNumber>
    <Description>test description</Description>
  </Details>
  <Details>
    <LineNumber>0004</LineNumber>
    <Description>test description</Description>
  </Details>
 </root>

Я бы хотел сгруппировать, чтобы получить этот результат

номер 123456 Описание теста 00010002 описание теста номер 789456 0003 описание теста0004 описание теста

Это мой xsl для xml

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

   <xsl:output method="html" />
    <xsl:template match="/">
     <html>
       <head>
    <title>HTML Document Example</title>
  </head>
  <body>
    <div class="page">
      <xsl:for-each select="root" >
        <xsl:for-each select="Services/Details" >
          <ul>
            <li><xsl:value-of select="LineNumber" /> | <xsl:value-of   select="Description" /> </li>
        </ul>
        </xsl:for-each>
      </xsl:for-each>
    </div>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>

Результат

0001 описание теста0002 описание теста0003 описание теста0004 описание теста

Заранее спасибо

1 Ответ

0 голосов
/ 10 декабря 2018

Вы усложняете себе задачу, пытаясь сначала выбрать Services/Details, так как вам придется беспокоиться о группировке.Однако данные уже «сгруппированы» в элементах General/Data, поэтому вместо этого начните с их выбора.

Чтобы получить подробную информацию о соответствующем Services/Details, сначала определите ключ ....

<xsl:key name="services" match="Services/Details" use="LineNumber" />

Затем, при расположении на Data элементах, вы можете получить все соответствующие данные, например, так ...

<xsl:for-each select="key('services', LineRefer)">

Попробуйте это XSLT

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

  <xsl:key name="services" match="Services/Details" use="LineNumber" />

  <xsl:template match="root">
    <html>
    <head>
      <title>HTML Document Example</title>
    </head>
    <body>
      <div class="page">
        <xsl:for-each select="General/Data" >
          <h1><xsl:value-of select="Number" /></h1>
          <ul>
            <xsl:for-each select="key('services', LineRefer)">
               <li><xsl:value-of select="LineNumber" /> | <xsl:value-of   select="Description" /> </li>
            </xsl:for-each>
          </ul>
        </xsl:for-each>
      </div>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

См. http://xsltfiddle.liberty -development.net / nc4NzRw , чтобы узнать об этом в действии.

Обратите внимание, ваш XML показывает xmlns="" в элементе root.Если в вашем фактическом XML это xmlns не пусто, это означает, что все ваши элементы XML находятся в пространстве имен по умолчанию, и вышеуказанный XSLT не будет работать.

В этом случае вам следует изменить XSLT, чтобы он отвечал за пространство имен.Есть много примеров того, как обрабатывать пространство имен по умолчанию в XSLT 1.0 здесь, на StackOverflow, но, как я чувствую, Christmassy, ​​взгляните на http://xsltfiddle.liberty -development.net / nc4NzRw / 1 для примера.

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