2013-03-08 3 views
0

У меня есть следующий шаблон XSL:XSLT XSL: копирование и XSL: для-каждый по атрибутам

<xsl:template match="@*|node()" mode="fix-entity-references"> 
    <xsl:copy> 
     <xsl:for-each select="@*"> 
      <xsl:if test="name() = 'href'"> 
       <xsl:variable name="hrefvar"> 
       <xsl:value-of select="current()"/> 
       </xsl:variable> 
       <xsl:attribute name="href"> 
       anything 
       </xsl:attribute> 
      </xsl:if> 
     </xsl:for-each> 
     <xsl:apply-templates select="@*|node()" mode="fix-entity-references"/> 
    </xsl:copy> 
    </xsl:template> 

Я хочу использовать этот шаблон, чтобы скопировать текущий узел, но только после обработки всех его атрибутов. Текущий образец очень прост и может быть заменен очень простым блоком. Экспериментальное выражение будет намного сложнее, так как существует N атрибутов для каждого элемента, удовлетворяющего выражению. Вот почему для каждого из них необходимо. Я хочу обрабатывать все эти атрибуты одинаково. Я попытался напечатать значение current(), которое всегда работает нормально. Проблема заключается в обновлении атрибута исходного узла. Установка значения атрибута «href» для «ничего» не будет работать, потому что, по моему мнению, к моменту, когда я его вызываю, он находится внутри каждого блока, что означает, что текущий узел является самим атрибутом.

Как установить атрибут исходного блока изнутри каждого блока, чтобы скопированный узел использовал измененные атрибуты?

Заранее спасибо.

ответ

1

Вместо for-each и if вы можете использовать шаблоны, соответствующие атрибутам, которые вы хотите обрабатывать по-разному, например.

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

<xsl:template match="@href | @foo | @bar" mode="fix-entity-references"> 
    <xsl:attribute name="{name()}"> 
    <xsl:value-of select=".."/> 
    </xsl:attribute> 
</xsl:template> 

В модели XPath данных атрибутов узлов не считаются потомками элемента, но родительский узел атрибута является элемент, атрибут принадлежит (то есть, когда узел контекста является атрибутом, .. это элемент, на котором можно найти атрибут). Таким образом, этот образец будет заменить значение любого href, foo или bar атрибута с текстовым содержанием, содержащим элемент атрибута, т.е.

<a href="#">http://example.com</a> 

станет

<a href="http://example.com">http://example.com</a> 
+0

Мне нравится много сэр спасибо! –

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