2011-12-18 4 views
1

Я пытаюсь сделать следующее:XSLT нумерация - группировка?

<body> 
    <div> 
     <p> text<note/>texttext<note/>text </p> 
     <p> text<note/>text </p> 
    </div> 
    <div> 
     text<note/>texttext<note/>text 
    </div> 
</body> 

должно привести к

<body> 
    <div> 
     <p> text<note n="1"/>texttext<note n="2"/>text </p> 
     <p> text<note n="3"/>text </p> 
    </div> 
    <div> 
     text<note n="1"/>texttext<note n="2"/>text 
    </div> 
</body> 

Как вы можете видеть, я хочу, чтобы пронумеровать все заметки под DIV независимо от родительского узла. Таким образом, заметки могут быть структурированы под div любым способом. Однако я не могу найти решение, используя xsl: number. Любая помощь будет оценена по достоинству.

Редактировать: Большое спасибо DRCB за его решение. Я адаптировал его так, чтобы его можно было также использовать для сложной вложенности, используя шаблон идентификации.

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

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

<xsl:template match="div//note"> 
    <note> 
     <xsl:attribute name="n"> 
      <xsl:value-of select="count(preceding::note) - count(preceding::div//note) + 1"/> 
     </xsl:attribute> 
     <xsl:value-of select="."/> 
    </note> 
</xsl:template> 


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

</xsl:stylesheet> 

tranforms:

<body> 
    <any> 
     <div> 
      <p> 
       <p> text<note/>texttext<note/>text </p> 
      </p> 
      <p> text<note/>text </p> 
     </div> 
    </any> 
    <div> text<note/>texttext<note/>text </div> 
</body> 

к:

<body> 
    <any> 
     <div> 
      <p> 
       <p> text<note n="1"/>texttext<note n="2"/>text </p> 
      </p> 
      <p> text<note n="3"/>text </p> 
     </div> 
    </any> 
    <div> text<note n="1"/>texttext<note n="2"/>text </div> 
</body> 

Я считаю, что может быть лучшим решением, однако это работает для меня.

+0

Попробуйте решения здесь: [переменная приращения XSLT] [1] [1]: http://stackoverflow.com/questions/3770951/xslt-increment-variable – vassilo

+0

Вы должны опубликовать свое решение как ответ на ваш собственный вопрос. Не редактируйте его в самом вопросе. – DanMan

+0

Я должен подождать 24 часа, прежде чем ответить на свой вопрос. Вот почему я редактировал сообщение. – Chris

ответ

1

Раствор с помощью xsl:number:

<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="note"> 
    <xsl:variable name="vNum"> 
    <xsl:number level="any" count="note" from="/*/div"/> 
    </xsl:variable> 
    <note n="{$vNum}"> 
    <xsl:apply-templates/> 
    </note> 
</xsl:template> 
</xsl:stylesheet> 

Когда это преобразование применяется на прилагаемом XML документа:

<body> 
<div> 
    <p> text<note/>texttext<note/>text </p> 
    <p> text<note/>text </p> 
</div> 
<div> 
    text<note/>texttext<note/>text 
</div> 
</body> 

полезный, правильный результат получают:

<body> 
    <div> 
     <p> text<note n="1"/>texttext<note n="2"/>text </p> 
     <p> text<note n="3"/>text </p> 
    </div> 
    <div> 
    text<note n="1"/>texttext<note n="2"/>text 
</div> 
</body> 

Пояснение: Соответствующее использование атрибута fromxsl:number.

1

я нашел следующий быстрое временное решение:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Edited by http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalogp --> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="div"> 
    [div <xsl:apply-templates/>] 
</xsl:template> 

<xsl:template match="note"> 
    [note n=<xsl:value-of select="count(preceding::note) - count(preceding::div//note) + 1"/>] 
</xsl:template> 
</xsl:stylesheet> 

Он работает, однако, только с «простой» сНом структурой без сложной вложенности.

Вы можете проверить его здесь: http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog с вашим источником xml.

+0

Спасибо. В настоящее время я пытаюсь адаптировать ваше решение, используя шаблон идентификации (т. Е. Match = "node() | @ *"). Я думаю, что это может сработать, чтобы его можно было также использовать для сложных гнезд. – Chris

+0

Мое решение добавлено выше. Большое спасибо! +1 – Chris

Смежные вопросы