Вы можете использовать шаблон применения преобразования идентичности для копирования всего и переопределения этого для узлов элементов Location
и Salary
, не копируя их, а просто обрабатывая их потомки.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- default: copy everything using the identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- override: for Location and Salary elements, just process the children -->
<xsl:template match="Location|Salary">
<xsl:apply-templates select="node()"/>
</xsl:template>
</xsl:stylesheet>
Обновлено для вашего последующего вопроса. Из вашего примера немного неясно, что еще вы на самом деле хотите сделать, но при условии, что в дополнение к вышесказанному вы также захотите:
Для некоторых элементов преобразовать атрибуты в дочерние элементы. Это можно сделать, добавив дополнительное правило переопределения, которое соответствует атрибутам и элементам вывода.
Для некоторых других элементов вообще удалите атрибуты. Вы можете сделать это так же, как описано выше, но на этот раз просто используйте пустой шаблон, который ничего не выводит.
Вывести содержимое некоторых элементов, используя CDATA
секции . Вы можете указать такие элементы с атрибутом cdata-section-elements
xsl:output
.
Пример таблицы стилей, демонстрирующий все это:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" media-type="application/xml"
cdata-section-elements="Summary"/>
<!-- default: copy everything using the identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- override: for Location and Salary nodes, just process the children -->
<xsl:template match="Location|Salary">
<xsl:apply-templates select="node()"/>
</xsl:template>
<!-- override: for selected elements, convert attributes to elements -->
<xsl:template match="Jobs/@*|Job/@*">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<!-- override: for selected elements, remove attributes -->
<xsl:template match="DateActive/@*|DateExpires/@*|DateUpdated/@*"/>
</xsl:stylesheet>