как создать файл xsl, который обращается к файлу свойств для преобразования файла xml в xml - PullRequest
1 голос
/ 30 марта 2012

Рассмотреть XML-файл как

<Content>
  <abc>....</abc>
</Content>

У меня есть файл свойств с предположением

 abc=def

и мой окончательно преобразованный XML-файл выглядит как

<Content>
  <def>....</def>
</Content>

так что мой xsl-файл, который преобразовывает первый xml-файл, должен использовать вышеуказанный файл свойств и преобразовать его. Кто-нибудь может подсказать, как мы можем добиться этого с помощью XSLT?

1 Ответ

0 голосов
/ 30 марта 2012

Если вы храните файл свойств в формате XML, например

<Properties>
    <Property value="abc">def</Property>
    <Property value="...">...</Property>
</Properties>

тогда вы можете использовать xslt для обработки обоих XML-файлов и замены элементов abc на def, etcetera.

Например

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:variable name="props" select="document('Properties.xml')"/>

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

    <xsl:template match="Content/*">
        <xsl:variable name="repl" select="$props/Properties/Property[@value=name(current())]"/>
        <xsl:choose>
            <xsl:when test="$repl">
                <xsl:element name="{$repl}">
                    <xsl:apply-templates/>
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:apply-templates/>
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Применительно к

<?xml version="1.0" encoding="UTF-8"?>
<Content>
  <abc>xxx</abc>
  <def>zzz</def>
  <ghi>ccc</ghi>
</Content>

с файлом свойств

<?xml version="1.0" encoding="UTF-8"?>
<Properties>
    <Property value="abc">def</Property>
    <Property value="def">www</Property>
</Properties>

это приводит к

<?xml version="1.0" encoding="UTF-8"?>
<Content>
    <def>xxx</def>
    <www>zzz</www>
    <ghi>ccc</ghi>
</Content>

ДОПОЛНЕНИЕ Дживаном

------------------------------------------------------------------------------------ 
      My question is that if i want to access 
         'value' attribute(input xml file tags) 

     ex:       
                  <Property value="abc">def</Property>

Я хочу, чтобы файл 'abc' был доступен из файла Properties.xml в другой переменной, скажем 'repl1', используя что-то вроде '$ props / Properties / ..' в select? как это может быть достигнуто.

ОТВЕТ Maestro13

До сих пор неясно, что вы хотите сделать, поэтому я просто дам вам несколько советов, которые, надеюсь, будут полезны.

Атрибут value может быть доступен с помощью выражения Xpath, включая /@value. Вы должны иметь текущий узел свойств, чтобы, конечно, иметь возможность этого. Это можно сделать, выполнив цикл следующим образом:

<xsl:for-each select="$props/Properties/Property">
    <w><xsl:value-of select="@value"/></w>
</xsl:for-each>

, где текущий узел в цикле является зацикленным, а @value действует на этот узел. Или вы можете определить шаблон, делающий то же самое (шаблон, если он не назван и не вызван напрямую, будет вызываться повторно для всех совпадающих узлов).
Другой способ получить атрибут value - это сначала получить выражение Xpath, которое выбирает ровно один элемент Property, например, выбрав n-е вхождение следующим образом:

<xsl:value-of select="$props/Properties/Property[3]/@value"/>

В случае вышеупомянутого файла свойств, это возвратит ghi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...