Часть 1 .
Так скажем, если идентификатор страны
равен 32, то следует добавить
Атрибут country = 32 для узла Employee.
Это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Employee[countryid=32]">
<Employee countryid="{countryid}">
<xsl:apply-templates select="@*|node()"/>
</Employee>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<Employees>
<Employee>
<countryid>32</countryid>
<id name="id">1</id>
<firstname >ABC</firstname>
<lastname >XYZ</lastname>
</Employee>
<Employee>
<countryid>100</countryid>
<id name="id">2</id>
<firstname >ddd</firstname>
<lastname >ggg</lastname>
</Employee>
</Employees>
дает желаемый, правильный результат :
<Employees>
<Employee countryid="32">
<countryid>32</countryid>
<id name="id">1</id>
<firstname>ABC</firstname>
<lastname>XYZ</lastname>
</Employee>
<Employee>
<countryid>100</countryid>
<id name="id">2</id>
<firstname>ddd</firstname>
<lastname>ggg</lastname>
</Employee>
</Employees>
Объяснение
Правило идентификации используется для копирования каждого узла как есть . Использование и переопределение правила идентификации (шаблона) является наиболее фундаментальным и мощным шаблоном проектирования XSLT.
Существует только один шаблон, который переопределяет правило идентификации для определенных узлов - Employee
элементов, которые имеют дочерний элемент countryid
со строковым значением (преобразуется в число) 32. Этот шаблон добавляет атрибут countryid
к элементу Employee
и применяет шаблоны для возобновления действия правила идентификации и копирования всего остального как есть.
Часть 2.
Также мы можем передать countryid через запятую
разделенные значения, чтобы я мог передать
32,100, а затем следует добавить
атрибут для всех совпадающих узлов
Это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pIds" select="'32,100'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Employee">
<Employee>
<xsl:if test=
"contains(concat(',',$pIds,','),
concat(',',countryid,',')
)">
<xsl:attribute name="countryid">
<xsl:value-of select="countryid"/>
</xsl:attribute>
</xsl:if>
<xsl:apply-templates select="@*|node()"/>
</Employee>
</xsl:template>
</xsl:stylesheet>
при применении к тому же XML-документу (см. Выше), дает требуемый, правильный результат :
<Employees>
<Employee countryid="32">
<countryid>32</countryid>
<id name="id">1</id>
<firstname>ABC</firstname>
<lastname>XYZ</lastname>
</Employee>
<Employee countryid="100">
<countryid>100</countryid>
<id name="id">2</id>
<firstname>ddd</firstname>
<lastname>ggg</lastname>
</Employee>
</Employees>