Я преобразую HTML-форму в последовательность XML, я использую рекурсивную функцию для достижения этого
, поэтому вход для параметра "list" будет иметь вид
name=value&name=value&name=value
Приведенный ниже шаблон делает это нормально и возвращает последовательность xml следующим образом
<name>value</name><name>value</name><name>value</name>
Хорошо, поэтому проблема в том, что некоторые пары имя-значение являются особыми, и я хотел бы добавить к ним атрибут, чтобы вывод был
<name>value</name><name attr="special">value</name><name>value</name>
поэтому для этого у меня есть внешний xml-файл со списком специальных имен следующим образом
<settings><google><option from="color"/><option from="size"/></google></settings>
Так что, если мы предположим, что у меня есть переменная xsl $ SETTINGS, подключенная к этому внешнемудокумент выше
<xsl:for-each select="$SETTINGS/google/option"></xsl:for-each>
Должен быть узел с 2 дочерними элементами 1 с именем color и другим размером
, что я хочу сделать, если 1 из этих дочерних имен = $ name добавить атрибут
что-то вроде <xsl:if test="$name = $SETTINGS/google/option/ckild name">
<xsl:template name="tokenize">
<xsl:param name="list"/>
<xsl:variable name="seperator" select="'&'"/>
<xsl:variable name="first" select="substring-before(concat($list, $seperator), $seperator)"/>
<xsl:variable name="butfirst" select="substring-after($list, $seperator)"/>
<xsl:variable name="name" select="normalize-space(substring-before($first, '='))"/>
<xsl:variable name="value" select="normalize-space(substring-after($first, '='))"/>
<xsl:if test="string-length($name)>0 and string-length($value)>0">
<xsl:element name="{$name}">
<xsl:for-each select="$SETTINGS/google/option">
-----> <xsl:if test="$name = $SETTINGS/google/option/ckild name">
<xsl:attribute name="option"/>
</xsl:if>
</xsl:for-each>
<xsl:value-of select="$value"/>
</xsl:element>
</xsl:if>
<xsl:if test="$butfirst">
<xsl:call-template name="tokenize">
<xsl:with-param name="list" select="$butfirst"/>
<xsl:with-param name="seperator" select="$seperator"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
Большое спасибо Тим Доджсон