Нумерация XSLT - группировка? - PullRequest
1 голос
/ 18 декабря 2011

Я пытаюсь сделать следующее:

<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.Буду признателен за любую помощь.

edit: Большое спасибо 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>

преобразовывает:

<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>

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

Ответы [ 2 ]

1 голос
/ 18 декабря 2011

Решение с использованием 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>

Объяснение : правильное использование атрибута from xsl:number.

1 голос
/ 18 декабря 2011

Я нашел следующее быстрое решение:

<?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>

Однако он работает только с "простой" структурой div без сложного вложения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...