Это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:ext="http://exslt.org/common">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pqueryString">
<s name="field1">Hello world!</s>
</xsl:param>
<xsl:variable name="vqs"
select="msxsl:node-set($pqueryString)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="input[@type='text']/@value">
<xsl:attribute name="value">
<xsl:value-of select=
"../@value[not($vqs/s[@name = current()/../@name])]
|
$vqs/s[@name = current()/../@name]
"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
при применении к этому XML-документу (исправлено при условии, что оно правильно сформировано):
<html>
<head></head>
<body>
<form id="myForm" method="POST">
<input name="field1" type="text" value="default" />
<input type="submit" onClick="function();"/>
</form>
</body>
</html>
дает желаемый, правильный результат :
<html>
<head></head>
<body>
<form id="myForm" method="POST">
<input name="field1" type="text" value="Hello world!"></input>
<input type="submit" onClick="function();"></input>
</form>
</body>
</html>
Примечание :
Правило идентификации используется для копирования документа как есть.
Строка запроса HTTP-запроса передается как внешний параметр с именем pqueryString
.
Используемое здесь расширение ext:node-set()
на практике не понадобится , поскольку параметр будет передаваться извне.
Единственное переопределение правила идентификации для атрибутов с именем value
.
Шаблон, соответствующий @value
, создает атрибут с тем же именем, и его значение равно , либо указанное пользователем (содержится в параметре строки запроса), либо если пользователь не сделал t указать значение для этого атрибута, а затем его текущее значение.