2011-02-21 6 views
0

Я хочу, чтобы преобразовать с помощью XSL:преобразование XSLT

<?xml version="1.0" encoding="utf-16"?> 
<root> 
<value1>test1</value1> 
<value2>test2</value2> 
<value3>test3</value3> 
</root> 

в:

<input type="hidden" value="test1" name="value1" /> 
<input type="hidden" value="test2" name="value2" /> 
<input type="hidden" value="test3" name="value3" /> 

Что такое лучший способ сделать это?

Thank you

ответ

4

Я думаю, что это правило семантически ясно и sucint:

<xsl:template match="*[starts-with(name(),'value')]"> 
    <input type="hidden" value="{.}" name="{name()}" /> 
</xsl:template> 
+0

+1 за хороший ответ - намного лучше, чем первый :) –

+0

@Alejandro спасибо –

+0

+1. Очистите один :) – Flack

1

У вас плохо спроектирован XML; если возможно, вместо <value1> вы должны использовать <value name="value1"> или что-то подобное.

что уже было сказано, вы можете сделать:

<xsl:template match="*[starts-with(name(),'value')]"> 
    <xsl:element name="input"> 
    <xsl:attribute name="type">hidden</xsl:attribute> 
    <xsl:attribute name="value"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    <xsl:attribute name="name"> 
     <xsl:value-of select="name()" /> 
    </xsl:attribute> 
    </xsl:element> 
</xsl:template> 

Если вы элементы были <value name="value1"> вместо этого, матч становится просто match="value", что намного быстрее, и имя атрибута становится <xsl:value-of select="@name">.

+0

NP; Это немного более многословно, чем использование синтаксиса '{}' для атрибутов, но лично я предпочитаю это, если нет веских оснований для этого; В таблице стилей нет элементов, отличных от xsl, что делает его более четким. – Flynn1179

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