Это стандартная таблица стилей XSLT 1.0, оптимизированная с помощью key()
:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="description" match="description" use="@value"/>
<xsl:variable name="map">
<description value="Value_1">Description_1</description>
<description value="Value_2">Description_2</description>
</xsl:variable>
<xsl:template match="InputDoc">
<OutputDoc>
<xsl:apply-templates/>
</OutputDoc>
</xsl:template>
<xsl:template match="InputCollection">
<xsl:variable name="me" select="."/>
<xsl:for-each select="document('')">
<xsl:if test="key('description',$me/InputItem/InputValue)">
<OutputElement>
<xsl:apply-templates select="$me/*"/>
<xsl:apply-templates select="key('description',$me/InputItem/InputValue)"/>
</OutputElement>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="InputItem">
<OutputItem>
<xsl:apply-templates/>
</OutputItem>
</xsl:template>
<xsl:template match="InputValue">
<OutputValue>
<xsl:apply-templates/>
</OutputValue>
</xsl:template>
<xsl:template match="description">
<OutputDescription>
<xsl:apply-templates/>
</OutputDescription>
</xsl:template>
</xsl:stylesheet>
Результат:
<OutputDoc>
<OutputElement>
<OutputItem>
<OutputValue>Value_1</OutputValue>
</OutputItem>
<OutputDescription>Description_1</OutputDescription>
</OutputElement>
</OutputDoc>
Примечание : «Сопоставление с образцом».key()
с несколькими документами (в данном случае это таблица стилей).
Редактировать : пропустить полосу OutputElement
для запроса несоответствующего значения, извините.
Теперь этот вход:
<InputDoc>
<InputCollection>
<InputItem>
<InputValue>Value_3</InputValue>
</InputItem>
</InputCollection>
</InputDoc>
Выход:
<OutputDoc></OutputDoc>
Примечание : Все это основано на шаблонах.Таким образом, вы можете применить больше логики даже к description
контенту.