2016-01-26 1 views
1

У меня есть XSL, как следует,XSLT - <xsl:number> элемент пропустить некоторые узлы

<doc> 
    <sec> 
     <para>para</para> 
     <para>para</para> 
     <para>§ 9.02A spara</para> 
     <para>para</para> 
     <para>para</para> 
    </sec> 
    <sec> 
     <para>para</para> 
     <para>para</para> 
     <para>para</para> 
     <para>para</para> 
     <para>para</para> 
    </sec> 
    <sec> 
     <para>para</para> 
     <para>para</para> 
     <para>para</para> 
     <para>para</para> 
     <para>para</para> 
    </sec> 
</doc> 

Мне нужно добавить имя атрибута type в <para> элемент, анализируя text() узел <para> элемента.

, если text() узел, начиная с «» § 9.02A атрибут типа должен быть «ххх» в противном случае атрибут типа должно быть последовательное числовое значение, начиная с номера 1 для каждого уровня, так что ожидается выход должен быть,

<doc> 
    <sec> 
     <para type="1">para</para> 
     <para type="2">para</para> 
     <para type="XXX">§ 9.02A spara</para> 
     <para type="3">para</para> 
     <para type="4">para</para> 
    </sec> 
    <sec> 
     <para type="1">para</para> 
     <para type="2">para</para> 
     <para type="3">para</para> 
     <para type="4">para</para> 
     <para type="5">para</para> 
    </sec> 
    <sec> 
     <para type="1">para</para> 
     <para type="2">para</para> 
     <para type="3">para</para> 
     <para type="4">para</para> 
     <para type="5">para</para> 
    </sec> 
</doc> 

Я написал XSL для этого, как следует,

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

    <xsl:template match="para"> 
     <xsl:variable name="position" as="xs:string"> 
      <xsl:number count="para" level="single" select=". except para[matches(.,'§\s\d+\.\d+[A-Z]')]"/> 
     </xsl:variable> 

     <para> 
      <xsl:if test="matches(.,'§\s\d+\.\d+[A-Z]')"> 
       <xsl:attribute name="type"> 
        <xsl:value-of select="'XXX'"/> 
       </xsl:attribute> 
       <xsl:apply-templates/> 
      </xsl:if> 
      <xsl:if test="not(matches(.,'§\s\d+\.\d+[A-Z]'))"> 
       <xsl:attribute name="type"> 
        <xsl:value-of select="$position"/> 
       </xsl:attribute> 
       <xsl:apply-templates/> 
      </xsl:if> 

     </para> 
    </xsl:template> 

проблема здесь есть, когда текст() начинается с '§ 9.02A' атрибутом не skiping этого уровня (см уровня один <para> сгенерированного выхода .. значения тока 1,2, XXX, 4,5. она должна быть 1,2, XXX, 3,4)

выходной ток,

<doc> 
    <sec> 
     <para type="1">para</para> 
     <para type="2">para</para> 
     <para type="XXX">§ 9.02A spara</para> 
     <para type="4">para</para> 
     <para type="5">para</para> 
    </sec> 
    <sec> 
     <para type="1">para</para> 
     <para type="2">para</para> 
     <para type="3">para</para> 
     <para type="4">para</para> 
     <para type="5">para</para> 
    </sec> 
    <sec> 
     <para type="1">para</para> 
     <para type="2">para</para> 
     <para type="3">para</para> 
     <para type="4">para</para> 
     <para type="5">para</para> 
    </sec> 
</doc> 

это может быть сделано с помощью другого метода, как графа() функции, но я действительно необходимо, чтобы сделать это в этом путь. может ли кто-нибудь предложить мне способ, как я могу изменить, чтобы получить правильный результат?

ответ

3

изменение

<xsl:number count="para" level="single" select=". except para[matches(.,'§\s\d+\.\d+[A-Z]')]"/> 

в

<xsl:number count="para[not(matches(.,'§\s\d+\.\d+[A-Z]+'))]" level="single"/> 
+2

Параметр 'самостоятельно: para' не нужен, я думаю,' ' должен делать тоже. –

+0

@MartinHonnen, как всегда, спасибо Мартину! –