2012-01-20 3 views
2

у меня есть XML-файл, подобный следующему:Как отобразить значения атрибута XML для некоторых других значений

<a> 
    <b value="a123" /> 
    <b value="b234" /> 
    <b value="c345" /> 
</a> 

Мне нужно отобразить атрибуты некоторое другое значение. Например, я хочу заменить a123 на q999, b234 с z998 и c345 с u997. Возможно ли эффективное преобразование с помощью XSLT? Само отображение создается, поэтому я могу преобразовать его практически в любой формат. Сейчас, скажем, это следующий XML-файл:

<map> 
    <item from="c345" to="u997" /> 
    <item from="b234" to="z998" /> 
    <item from="a123" to="q999" /> 
</map> 

Может быть, есть лучший инструмент, чем XSLT, чтобы сделать такое преобразование? В настоящее время я просто sed через файл много раз. Очевидно, что это решение ужасно неэффективно и вообще не масштабируется.

ответ

5

Как легко, как это:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<my:map> 
    <map> 
    <item from="c345" to="u997" /> 
    <item from="b234" to="z998" /> 
    <item from="a123" to="q999" /> 
    </map> 
</my:map> 

<xsl:variable name="vMap" select= 
    "document('')/*/my:map/*/*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
"@value[. = document('')/*/my:map/*/*/@from]"> 
    <xsl:attribute name="value"> 
    <xsl:value-of select="$vMap[@from = current()]/@to"/> 
    </xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

, когда это преобразование применяется на поставленном XML документа:

<a> 
    <b value="a123" /> 
    <b value="b234" /> 
    <b value="c345" /> 
</a> 

разыскиваемый, правильный результат получается:

<a> 
    <b value="q999"/> 
    <b value="z998"/> 
    <b value="u997"/> 
</a> 

Объяснение:

  1. Переопределение identity template для value атрибутов WHOS значение равно атрибут from в карте.

  2. Карта представлена ​​встроенным в преобразование и доступна с использованием функции document(). В качестве альтернативы путь к файлу, содержащему карту, может быть передан как внешний параметр в преобразование, и к документу карты XML можно получить доступ, используя снова функцию document(), передав в качестве аргумента этому пути к файлу.

Смежные вопросы