Чтобы проверить, существует ли элемент, вы можете использовать xsl:if
или xsl:when
с соответствующими test="element_name"
.
Пример сценария, выполняющего вашу задачу, может быть следующим:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*[matches(name(),'[a-z]+\d+','i')]">
<xsl:copy>
<xsl:variable name="curr" select="."/>
<xsl:for-each select="('A','B','C')">
<xsl:variable name="childName" select="concat('Test',.)"/>
<xsl:variable name="elem" select="$curr/*[name() = $childName]"/>
<xsl:element name="{$childName}">
<xsl:choose>
<xsl:when test="$elem">
<xsl:value-of select="$elem"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>Surrogate value for </xsl:text>
<xsl:value-of select="$childName"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates/></xsl:copy>
</xsl:template>
</xsl:stylesheet>
Основная часть представляет собой шаблон, соответствующий элементу, имя которого состоит из букв (по крайней мере, одной) и затем цифр (снова, по крайней мере, одной).
Затем для хранения * 1012 необходима переменная curr
* текущий элемент , потому что цикл for-each
меняет его, но нам все еще нужна ссылка на текущий элемент external .
For-each
цикл организует обработку любого дочернего элемента Test ... элемент, имя которого заканчивается на A
, B
или C
.
Если требуемый дочерний элемент существует, его значение печатается, в противном случае сценарий печатает соответствующийсуррогатное значение.
Возможно, вам нужна не последняя версия, но, по крайней мере, у вас есть отправная точка для создания окончательной версии.