2013-10-07 2 views
0

У меня есть XML, который выглядит следующим образом:XSL шаблон матч на атрибут родительского

<section class="DoCO:Section"> 
    <h1 class="DoCO:SectionTitle" id="42" page="3" column="2">EXPERIMENT</h1> 
    <region class="DoCO:TextChunk" id="43" page="3" column="2">lots of body<xref ref-type="bibr" rid="R7" id="35" class="deo:Reference">7</xref> text</region> 
    <region class="DoCO:FigureBox" id="F4"> 
     <image class="DoCO:Figure" src="2cn.page_003.image_04.png" thmb="2cn.page_003.image_04-thumb.png"/> 
     <caption class="deo:Caption" id="44" page="3" column="2">Figure 4: Experimental Setup</caption> 
    </region> 

Я использовал следующий XSL для сопоставления элементов внешних ссылок по отдельности:

   <xsl:for-each select="article/body/section"> 
        <sec> 
         <xsl:for-each select="h1"> 
          <title> 
           <xsl:value-of select="string(.)"/> 
          </title> 
         </xsl:for-each> 

         <xsl:for-each select="region"> 
          <p> 
           <xsl:apply-templates/> 
          </p> 
         </xsl:for-each> 
</xsl:template> 
<xsl:template match="xref"> 
    <xref/> 
</xsl:template> 

Однако, Я хочу иметь возможность группировать элементы изображения и субтитров вместе в пределах данного региона, не изменяя в настоящее время очень открытый способ обработки элементов региона, поэтому я пытаюсь сделать следующее:

<xsl:template match="@class[.='DoCO:FigureBox']"> 
    <fig xmlns:xlink="http://www.w3.org/1999/xlink"> 
     <graphic> 
      <xsl:for-each select="image"> 
       <xsl:attribute name="xlink:href"> 
        <xsl:value-of select="@src"/> 
       </xsl:attribute> 
      </xsl:for-each> 
     </graphic> 
     <caption> 
      <xsl:for-each select="caption"> 
       <xsl:value-of select="string(.)"/> 
      </xsl:for-each> 
     </caption> 
    </fig> 
</xsl:template> 

Но match = "@ class [. = 'DoCO: FigureBox']", похоже, не срабатывает. Невозможно ли сопоставить атрибут родителя xsl: apply-templates так же, как вы можете сопоставить дочерний элемент?

Спасибо!

+0

Не могли бы вы дать образец вашего ожидаемого результата в этом случае, просто чтобы понять, чего вы пытаетесь достичь? Благодаря! –

ответ

2

Там нет ничего плохого со следующим синтаксисом:

<xsl:template match="@class[.='DoCO:FigureBox']"> 

Ваш (первая) проблема, лежит здесь

<xsl:apply-templates/> 

Это стенография для этого

<xsl:apply-templates select="node()" /> 

Это означает, что вы не выбираете какие-либо атрибуты, и поэтому ваш шаблон соответствует атрибуту @class не будет вызываться.

Теперь, вы можете изменить его к этому

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

Но это приводит к второй проблеме. В шаблоне сопоставления @class, у вас есть несколько XSL: для каждого- заявления, для изображений и подписи. Но на данный момент вы находитесь на атрибуте @class, а не региона элементов, и поэтому эти xsl: for-each заявления ничего не найдут.

Что вы, вероятно, должны делать, это то, что вместо того, чтобы делать <xsl:for-each select="region"> в вашем основном коде, сделайте <xsl:apply-templates select="region" />. Затем, вы можете иметь два шаблона, как и

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

<xsl:template match="region[@class='DoCO:FigureBox']"> 
    <fig xmlns:xlink="http://www.w3.org/1999/xlink"> 
     <graphic> 
      <xsl:for-each select="image"> 
       <xsl:attribute name="xlink:href"> 
        <xsl:value-of select="@src"/> 
       </xsl:attribute> 
      </xsl:for-each> 
     </graphic> 
     <caption> 
      <xsl:for-each select="caption"> 
       <xsl:value-of select="string(.)"/> 
      </xsl:for-each> 
     </caption> 
    </fig> 
</xsl:template> 

Процессор XSLT должен отдавать приоритет более конкретного шаблона в этом случае, так будет переопределить обработку области элемента по умолчанию.

В самом деле, если вы всегда будете иметь один подпись и изображение в регионе, вы могли бы упростить шаблон для этого:

<xsl:template match="region[@class='DoCO:FigureBox']"> 
    <fig xmlns:xlink="http://www.w3.org/1999/xlink"> 
     <graphic xlink:href="{@src}" /> 
     <caption> 
      <xsl:value-of select="caption" /> 
     </caption> 
    </fig> 
</xsl:template> 

Обратите внимание на использование атрибутов шаблонов Value в создании атрибут.Скопированные фигурные скобки указывают и выражение, которое должно быть оценено, а не выводиться буквально.

+0

спасибо! это существенно менее хаки, что мой предыдущий XSL! – serilain

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