Ваш вопрос на самом деле совсем не ясен, но в целом, если вы хотите, чтобы преобразование идентичности заполняло родительский элемент дочерним элементом по умолчанию, вы должны создать для этого шаблон, например ::
<xsl:template match="Parent[not(Child)]">
<xsl:copy>
<Child>This is the default Child element</Child>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
Обычное преобразование идентичности скопирует любой элемент Parent
, который имеет дочерний элемент Child
; этот, который соответствует только тем, которые этого не делают, копирует элемент Parent
и его содержимое, но вставляет в него элемент Child
.
Edit:
Теперь, когда мы знаем немного больше о данных, вот лучший пример. Кроме того, это решает проблему создания элемента в правильном порядке в документе:
<xsl:template match="Salary/Max[not(preceding-sibling::Min)]"/>
<Min Value="0">0</Min>
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
Это будет соответствовать любому элементу Max
, который является дочерним по отношению к Salary
и у которого нет предшествующего родного брата по имени Min
, и будет испускать элемент Min
по умолчанию и затем копию Max
элемент.
Если вы хотите быть еще более явным, вы можете использовать шаблон Salary/Max[not(preceding-sibling::*[1]/name() = 'Min')]
, который будет соответствовать любому элементу Max
, чей непосредственно предшествующий брат не назван Min
.