XSLT - Работа с несколькими дочерними узлами - PullRequest
2 голосов
/ 09 августа 2011

Мне нужно написать и XSLT для работы со следующим XML:

<Attachments>
    <string>http://lurl/site/Lists/Note/Attachments/image1.jpg</string>
    <string>http://lurl/site/Lists/Note/Attachments/image3.jpg</string>
</Attachments>

Мне нужно вывести 2 строки, хотя для некоторых записей нужно вывести более 2 строк.

, например

<ul>
  <li>http://lurl/site/Lists/Note/Attachments/image1.jpg</li>
  <li>http://lurl/site/Lists/Note/Attachments/image3.jpg</li>
</ul>

Нужно ли мне для каждого или при ?

Ответы [ 4 ]

2 голосов
/ 09 августа 2011

Простое apply-templates должно это сделать.

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

<xsl:template match="string">
  <li><xsl:value-of select="."/></li>
</xsl:template>
2 голосов
/ 09 августа 2011

Вам не нужны никакие итерации.Используйте преобразование Identity и переопределите:

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

    <xsl:output indent="yes"/>

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

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

    <xsl:template match="string">
        <li><xsl:value-of select="."/></li>
    </xsl:template>

</xsl:stylesheet>
0 голосов
/ 09 августа 2011
<ul>
<xsl:for-each select="//Attachments/string">
  <li>
    <xsl:value-of select="text()" />
  </li>
</xsl:for-each>
</ul>
0 голосов
/ 09 августа 2011

Один из подходов - использовать xsl:template

<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:template match="/">
  <ul>
    <xsl:apply-templates />
  </ul>
</xsl:template>

<xsl:template match="/Attachments/string">
  <li>
    <xsl:value-of select="." />
  </li>
</xsl:template>
</xsl:stylesheet>
...