Как преобразовать этот XML в HTML, используя XSLT..PART-2? - PullRequest
0 голосов
/ 14 ноября 2011

Ниже приведен фрагмент кода XML -

<groups>
  <group i=1>
    <member t="P.M" c="Y">ABC</member>
    <member t="P.L">PQR</member>
    <member t="M">XYZ</member>
  </group>
  <group i=2>
    <member t="M" c="Y">ABC</member>
    <member t="M">PQR</member>  
  </group>
  <group i=3>
    <member t="P.L" c="Y">ABC</member>
    <member t="M">PQR</member>  
    <member t="M">XYZ</member>  
  </group>
  <group i=4>
    <member t="M">ABC</member>
    <member t="M" c="Y">PQR</member>    
  </group>
  <group i=5>
    <member t="M">ABC</member>
    <member t="M" c="Y">PQR</member>    
    <member t="M" c="Y">XYZ</member>    
  </group>
  <group i=6>
    <member t="M" dec="Y">ABC</member>
  </group>

</groups>

Требуемый вывод HTML с использованием XSLT 1.0 -

<U>ABC</U>, P.M, PQR, P.L and XYZ, M
<U>ABC</U> and PQR, MM
<U>ABC</U>, P.L, PQR and XYZ, MM
ABC and <U>PQR</U>, MM
ABC, <U>PQR</U> and <U>XYZ</U>, MM
<U>ABC</U>, M

частичное Решение XSLT для вышеприведенного вывода -

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='html' media-type='text/html'/>
<xsl:template match="/">
  <html>
  <body>
<xsl:apply-templates/>
  </body>
  </html>
</xsl:template>

<xsl:template match="group">
    <p>
      <xsl:apply-templates select="@*|node()"/>
    </p>
</xsl:template>

<xsl:template match="member">
   <xsl:choose>
     <xsl:when test='@c = "Y"'>
       <u><xsl:value-of select="."/></u>, <xsl:value-of select='@t'/>
     </xsl:when>
     <xsl:otherwise>
       <b><xsl:value-of select="."/></b>, <xsl:value-of select='@t'/>
     </xsl:otherwise>
   </xsl:choose>
</xsl:template>

<xsl:template match="member[following-sibling::member]">
  <xsl:choose>
    <xsl:when test='@c = "Y"'>
      <u><xsl:value-of select="."/></u>, <xsl:value-of select='@t'/>
      <xsl:text> and </xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <b><xsl:value-of select="."/></b>, <xsl:value-of select='@t'/>
      <xsl:text> and </xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="member[following-sibling::member[following-sibling::member]]">
  <xsl:choose>
    <xsl:when test='@c = "Y"'>
      <u><xsl:value-of select="."/></u>, <xsl:value-of select='@t'/>
      <xsl:text>, </xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <b><xsl:value-of select="."/></b>, <xsl:value-of select='@t'/>
      <xsl:text>, </xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
</xsl:stylesheet>

Вышеуказанный XSLT дает вывод в правильном формате, как требуется, но если <member> того же типа, как добавить этот тип в конце..

1 Ответ

1 голос
/ 15 ноября 2011

В ответ на ваш ближайший вопрос, чтобы вывести правильное количество t элементов для члена, вы можете сделать что-то вроде этого:

<xsl:apply-templates select="../member/@t[. = current()/@t]"/>

Итак, он выведетзначение для каждого соответствующего атрибута @t.

Однако я думаю, что вам нужно больше узнать о группировке, как предложил мистер Майкл Кей в своем последнем вопросе.

В этом случае выгруппируются по атрибуту group и атрибуту member .Итак, вы бы определили ключ, например:

<xsl:key name="members" match="member" use="concat(../@i, '|', @t)"/>

Обратите внимание на использование канала | для объединения двух частей ключа.Вам нужно будет выбрать символ, который не может встречаться ни в одной части ключа.

Затем вы можете получить первый элемент каждой группы следующим образом:

<xsl:apply-templates 
 select="group/member[generate-id() = generate-id(key('members', concat(../@i, '|', @t))[1])]"
 mode="group"/>

И перебиратьвсе элементы в группе, вы можете сделать это ...

<xsl:apply-templates select="key('members', concat(../@i, '|', @t))"/>

Итак, учитывая следующий XML

<groups>
   <group i="1">
      <member t="P.M" c="Y">ABC</member>
      <member t="P.L">PQR</member>
      <member t="M">XYZ</member>
   </group>
   <group i="2">
      <member t="M" c="Y">ABC</member>
      <member t="M">PQR</member>
   </group>
   <group i="3">
      <member t="P.L" c="Y">ABC</member>
      <member t="M">PQR</member>
      <member t="M">XYZ</member>
   </group>
   <group i="4">
      <member t="M">ABC</member>
      <member t="M" c="Y">PQR</member>
   </group>
   <group i="5">
      <member t="M">ABC</member>
      <member t="M" c="Y">PQR</member>
      <member t="M" c="Y">XYZ</member>
   </group>
   <group i="6">
      <member t="M" c="Y">ABC</member>
   </group>
</groups>

Используя следующий XSLT ....

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

   <xsl:key name="members" match="member" use="concat(../@i, '|', @t)"/>

   <xsl:template match="/groups">
      <xsl:apply-templates select="group/member[generate-id() = generate-id(key('members', concat(../@i, '|', @t))[1])]" mode="group"/>
   </xsl:template>

   <xsl:template match="member" mode="group">
      <xsl:apply-templates select="key('members', concat(../@i, '|', @t))"/>
      <xsl:text>, </xsl:text>
      <xsl:apply-templates select="../member/@t[. = current()/@t]"/>
      <xsl:variable name="others" select="count(following-sibling::member[@t != current()/@t])" />
      <xsl:choose>
         <xsl:when test="$others &gt; 1">, </xsl:when>
         <xsl:when test="$others = 1"> and </xsl:when>
         <xsl:otherwise>
            <xsl:text>&#13;</xsl:text>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>

   <xsl:template match="member">
      <xsl:choose>
         <xsl:when test="@c='Y'">
            <u>
               <xsl:value-of select="."/>
            </u>
         </xsl:when>
         <xsl:otherwise>
            <xsl:value-of select="."/>
         </xsl:otherwise>
      </xsl:choose>
      <xsl:variable name="others" select="count(following-sibling::member[@t = current()/@t])" />
      <xsl:choose>
         <xsl:when test="$others &gt; 1">, </xsl:when>
         <xsl:when test="$others = 1"> and </xsl:when>
      </xsl:choose>
   </xsl:template>
</xsl:stylesheet>

Выводится следующее ....

<u>ABC</u>, P.M, PQR, P.L and XYZ, M
<u>ABC</u> and PQR, MM
<u>ABC</u>, P.L, PQR and XYZ, MM
ABC and <u>PQR</u>, MM
ABC, <u>PQR</u> and <u>XYZ</u>, MMM
<u>ABC</u>, M
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...