XLST с помощью поиска - PullRequest
       2

XLST с помощью поиска

2 голосов
/ 10 августа 2011

Я пытаюсь преобразовать документ XML в другой документ XML.Я пробовал различные подходы, ни один из которых не дал желаемого целевого XML-документа.

У меня есть гипотетический входной XML-документ, подобный этому:

<rows>
 <row>
  <name>ON</name>
  <description/>
 </row>
 <row>
  <name>NY</name>
  <description/>
 </row>
</rows>

У меня также есть два поиска:

<loc:locations>
 <loc:location>
  <loc:code>ON</loc:code>
  <loc:value>Ontario</loc:value>
 </loc:location>
 <loc:location>
  <loc:code>NY</loc:code>
  <loc:value>New York</loc:value>
 </loc:location>
</loc:locations>

<des:descriptions>
 <des:description>
  <des:code>ON</des:code>
  <des:value>Ontario is a province in Canada</des:value>
 </des:description>
 <des:description>
  <des:code>NY</des:code>
  <des:value>New York is a state in the USA</des:value>
 </des:description>
</des:descriptions>

Я бы хотел, чтобы входной XML был преобразован в этот целевой XML:

<places>
 <place>
  <name>Ontario</name>
  <description>Ontario is a province in Canada</description>
 </place>
 <place>
  <name>New York</name>
  <description>New York is a state in the USA</description>
 </place>
</places>

Что такое XSLT для этого?Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Просто чтобы очистить вещи для удобства чтения, поскольку вы приняли соглашение о пространстве имен, вы также можете удобно сохранить все данные поиска в одной переменной.Также используйте current() для доступа к name текущего узла.Избегайте //.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:loc="http://sample.com/location"
    xmlns:des="http://sample.com/description"
    version="1.0">

    <xsl:variable name="lookup" 
        select="document('locations.xml')/loc:locations/loc:location
        | document('descriptions.xml')/des:descriptions/des:description"/>

    <xsl:template match="rows">
        <places>
            <xsl:apply-templates/>
        </places>
    </xsl:template>

    <xsl:template match="row">
        <place>
            <name>
                <xsl:value-of select="$lookup[loc:code=current()/name]/
                    loc:value"/>
            </name>
            <description>
                <xsl:value-of select="$lookup[des:code=current()/name]/
                    des:value"/>
            </description>
        </place>
    </xsl:template>

</xsl:stylesheet>
2 голосов
/ 10 августа 2011

Это сработало для меня с Xalan :

<xsl:transform 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:loc="http://sample.com/location"
  xmlns:des="http://sample.com/description"
  version="1.0">

 <xsl:output method="xml"/>

 <xsl:variable name="locations" select="document('locations.xml')/loc:locations/loc:location"/>
 <xsl:variable name="descriptions" select="document('descriptions.xml')/des:descriptions/des:description"/>

 <xsl:template match="/">
    <places>
      <xsl:apply-templates/>
    </places>
 </xsl:template>

 <xsl:template match="//row">
  <xsl:variable name="name" select="name/text()"/>
  <place>
    <name><xsl:value-of select="$locations[loc:code = $name]/loc:value"/></name>
    <description><xsl:value-of select="$descriptions[des:code = $name]/des:value"/></description>
  </place>
 </xsl:template>

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