Создать список с XSLT из двух документов xml - PullRequest
2 голосов
/ 12 марта 2012

У меня есть следующий XML-файл:

<root>
  <sub type="print">print</sub>
  <sub type="email">email</sub>
</root>

Я хочу сопоставить каждый тип со следующим списком:

<types>
  <type>email</type>
  <type>broadcast</type>
  <type>mobile</type>
  <type>print</type>
  <type>web</type>
</types>

Используя этот xslt с "doc", являющимся XML и "типами", вышеприведенный список передается в качестве параметров:

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

  <xsl:output method="xhtml" indent="yes" />

  <xsl:param name="doc"/>
  <xsl:param name="types"/>   

  <xsl:template match="/">
    <xsl:for-each select="$doc//sub">
      <xsl:variable name="count">
        <xsl:number value="position()" format="1"/>
      </xsl:variable>

      <ul>
        <xsl:for-each select="$types//type">
          <xsl:choose>
            <xsl:when test="$doc//sub[$count]/@type = text()">
              <li>
                <b>
                  <xsl:value-of select="$doc//sub[$count]/@type"/> - <xsl:value-of select="text()"/>
                </b>
              </li>
            </xsl:when>
            <xsl:otherwise>
              <li>
                <xsl:value-of select="$doc//sub[$count]/@type"/> - <xsl:value-of select="text()"/>
              </li>
            </xsl:otherwise>
          </xsl:choose> 
        </xsl:for-each>
      </ul>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Это должно дать мне неупорядоченный список для каждого сабвуфера в моей XML-печати с типом сабвуфера и затем с каждым типом Когда сабвуфер и тип совпадают, он должен быть выделен жирным шрифтом. Я хочу это:

<ul>
  <li>print - email</li>
  <li>print - broadcast</li>
  <li>print - mobile</li>
  <li><b>print - print</b></li>
  <li>print - web</li>
</ul>
<ul>
  <li><b>email - email</b></li>
  <li>email - broadcast</li>
  <li>email - mobile</li>
  <li>email - print</li>
  <li>email - web</li>
</ul>

Но я получаю это:

<ul>
  <li><b>print email - email</b></li>
  <li>print email - broadcast</li>
  <li>print email - mobile</li>
  <li><b>print email - print</b></li>
  <li>print email - web</li>
</ul>
<ul>
  <li><b>print email - email</b></li>
  <li>print email - broadcast</li>
  <li>print email - mobile</li>
  <li><b>print email - print</b></li>
  <li>print email - web</li>
</ul>

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Я думаю, что это может иметь какое-то отношение к многократному использованию //.

Попробуйте заменить корневой шаблон (match="/") следующим:

  <xsl:template match="/">
    <html>
      <xsl:for-each select="$doc/root/sub">
        <xsl:variable name="vType" select="@type"/>
        <ul>
          <xsl:for-each select="$types/types/type">
            <li>
              <xsl:choose>
                <xsl:when test=".=$vType">
                  <b>
                    <xsl:value-of select="concat($vType,' - ',.)"/>
                  </b>
                </xsl:when>
                <xsl:otherwise>
                  <xsl:value-of select="concat($vType,' - ',.)"/>
                </xsl:otherwise>
              </xsl:choose>            
            </li>
          </xsl:for-each>
        </ul>
      </xsl:for-each>      
    </html>
  </xsl:template>

ПРИМЕЧАНИЕ. Я добавил тег <html>, чтобы при выводе в тестовый файл все было в порядке.

0 голосов
/ 12 марта 2012

С учетом вашего подфайла в качестве основного ввода и типов в subtypes.xml

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


<xsl:template match="sub">
 <ul>
  <xsl:apply-templates select="doc('subtypes.xml')">
   <xsl:with-param name="this" select="." tunnel="yes"/>
  </xsl:apply-templates>
 </ul>
</xsl:template>

<xsl:template match="type">
 <xsl:param name="this" tunnel="yes"/>
 <li>
  <xsl:choose>
   <xsl:when test="$this/@type=.">
    <b><xsl:value-of select="$this/@type,' - ',."/></b>
   </xsl:when>
   <xsl:otherwise>
    <xsl:value-of select="$this/@type,' - ',."/>
   </xsl:otherwise>
  </xsl:choose>
 </li>
</xsl:template>

</xsl:stylesheet>

производит:

<?xml version="1.0" encoding="UTF-8"?>
  <ul>
  <li>print  -  email</li>
  <li>print  -  broadcast</li>
  <li>print  -  mobile</li>
  <li><b>print  -  print</b></li>
  <li>print  -  web</li>
</ul>
  <ul>
  <li><b>email  -  email</b></li>
  <li>email  -  broadcast</li>
  <li>email  -  mobile</li>
  <li>email  -  print</li>
  <li>email  -  web</li>
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...