Перечислите элементы, имеющие теги <li><ui> файла XML, используя xslt - PullRequest
2 голосов
/ 29 февраля 2012

у меня есть мой XML, как это

<p>
    <ul>
        <li>Coffee</li>
        <li>Milk</li>
        <li>shilk</li>
        <li>tilk</li>
        <li>pilk</li>
    </ul>
</p>

и я конвертирую эти теги в этот формат, используя XSLT

<ul>
    <li>Coffee</li>
    <li>Milk</li>
    <li>shilk</li>
    <li>tilk</li>
    <li>pilk</li>
</ul>

но я не нашел API или метода для этого, я пытался, но как показать этот символ и правильно перечислить элементы в порядке. и я использую этот код для выполнения этого, но он не работает

<xsl:template match="p">        
        <ul>
        <xsl:for-each select="ul">    
          <li><xsl:value-of select="text()"/></li>
        </xsl:for-each>
        </ul>
    </xsl:template>

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

Нет необходимости использовать так много xsl:for-each для этого преобразования. Что вы действительно должны сделать, это использовать шаблон идентификации и переопределить его для элемента <p>. Таким образом, если вам нужно внести дополнительные изменения в другие части вашего XML, гораздо проще изменить таблицу стилей, переопределив шаблон идентификации.

Пример:

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

  <!-- Identity template. This will copy everything unchanged. (unless it's 
       matched by another template)-->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="p">
    <xsl:apply-templates/>
  </xsl:template>

</xsl:stylesheet>

Используя ваш ввод, он выведет следующее:

<ul>
   <li>Coffee</li>
   <li>Milk</li>
   <li>shilk</li>
   <li>tilk</li>
   <li>pilk</li>
</ul>

Что в браузере выглядит так:

  • Кофе
  • Молоко
  • shilk
  • Tilk
  • Pilk
1 голос
/ 29 февраля 2012

Если вы выводите HTML: ниже указан код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="html" indent="yes"/>

  <xsl:template match="p">
      <xsl:for-each select="ul">
        <ul>
          <xsl:for-each select="li">
            <li>
              <xsl:value-of select="."/>
            </li>
          </xsl:for-each>
        </ul>
      </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

, вывод:

  • Кофе
  • Молоко
  • Шилк
  • тильк
  • пилк
0 голосов
/ 29 февраля 2012

I. Это, наверное, самое простое и самое короткое решение :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="p">
  <xsl:copy-of select="*"/>
 </xsl:template>
</xsl:stylesheet>

При применении к предоставленному документу XML :

<p>
    <ul>
        <li>Coffee</li>
        <li>Milk</li>
        <li>shilk</li>
        <li>tilk</li>
        <li>pilk</li>
    </ul>
</p>

желаемый, правильный результат получается :

<ul>
   <li>Coffee</li>
   <li>Milk</li>
   <li>shilk</li>
   <li>tilk</li>
   <li>pilk</li>
</ul>

II. Более расширяемое решение - переопределение правила идентификации :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="p">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...