foreach
и if
- обычно неправильный подход в XSLT.Гораздо эффективнее применять шаблоны к шаблонам.В этом случае вы можете использовать два: первый устанавливает корневой элемент и соответствует элементам, с которыми вы хотите работать:
<xsl:template match='/'>
<Readings>
<xsl:apply-templates select='Reading/State/StateValues'/>
</Readings>
</xsl:template>
, а второй - что вышеупомянутый срабатывает, когда найдено совпадение, которое выполнитосновная работа.Сложность здесь заключается в создании элемента динамически, что означает использование синтаксиса {XPath}
для получения имени из входного документа:
<xsl:template match='StateValues'>
<xsl:element name='{Name}'>
<xsl:value-of select='Value' />
</xsl:element>
</xsl:template>