2014-02-07 4 views
0

Вот отрывок из моего входного файла XML:XSLT: Удельное размещение тегов

<p>List: 
<ul> 
<li>a</li> 
<li>b</li> 
<li>c</li> 
</ul>This is a list</p> 

Мне нужно, чтобы отобразить это в моем выходе XML как:

<p>List:</p> 
<ul> 
<li>a</li> 
<li>b</li> 
<li>c</li> 
</ul><p>This is a list</p> 

Я сделал это просто жестко прописывать тег p, который не оказался полезным в долгосрочной перспективе. Предположим, что нет "This is a list", то он дал мне это:

<p>List:</p> 
<ul> 
<li>a</li> 
<li>b</li> 
<li>c</li> 
</ul><p></p> 

Файл является действительным, но мне не нужен пустой p тег.

ответ

0

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

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> 

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

<xsl:template match="p/text()"> 
    <p><xsl:value-of select="."/></p> 
</xsl:template> 

<xsl:template match="ul"> 
    <xsl:copy-of select="."/> 
</xsl:template> 
</xsl:stylesheet> 
0

здесь является тот, который использует xsl:for-each-group

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

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

<xsl:template match="p"> 
    <xsl:for-each-group select="node()" group-adjacent="if (self::text()) then 1 else 0"> 
     <xsl:choose> 
      <xsl:when test="current-grouping-key()"> 
       <p><xsl:copy-of select="current-group()"/></p> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:copy-of select="current-group()"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each-group> 
</xsl:template> 

</xsl:stylesheet> 
Смежные вопросы