XSLT: как преобразовать структуру в XML с помощью XSLT 1

Я пытаюсь преобразовать иерархию/структуру в XML с помощью XSLT 1, но безуспешно. - даже найти хорошие ссылки...

ввод xml


<Address addressType="R">
 <Structured xmlns="cds_dt">
  <Line1>15 Paradise</Line1>
  <City>Toronto</City>
  <CountrySubdivisionCode>-50</CountrySubdivisionCode>
  <PostalZipCode>
    <PostalCode>A1A1O1</PostalCode>
  </PostalZipCode>
 </Structured>
</Address>

желаемый вывод xml


<Address addressType="R">
  <Formatted xmlns="cds_dt">15 Paradise, Toronto, A1A1O1</Formatted>
</Address>

Я попробовал этот .xsl, но не повезло - ошибка в файле


<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:x="cds"> 

<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*" />

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

<xsl:template match="*[ancestor::address]">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()[ancestor::address::Structured]">
  <xsl:value-of select="concat('&#44;',.)"/>
</xsl:template>

</xsl:stylesheet> 

person user610064    schedule 02.03.2012    source источник


Ответы (2)


Это преобразование:

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

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

 <xsl:template match="x:Structured">
  <xsl:element name="Formatted" namespace="cds_dt">
   <xsl:value-of select=
   "concat(x:Line1, ', ', x:City, ', ', x:PostalZipCode/x:PostalCode)"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу:

<Address addressType="R">
    <Structured xmlns="cds_dt">
        <Line1>15 Paradise</Line1>
        <City>Toronto</City>
        <CountrySubdivisionCode>-50</CountrySubdivisionCode>
        <PostalZipCode>
            <PostalCode>A1A1O1</PostalCode>
        </PostalZipCode>
    </Structured>
</Address>

выдает желаемый правильный результат:

<Address addressType="R">
   <Formatted xmlns="cds_dt">15 Paradise, Toronto, A1A1O1</Formatted>
</Address>

Объяснение: переопределение правила идентификации + правильное использование пространств имен и <xsl:element> инструкция.

person Dimitre Novatchev    schedule 02.03.2012

Вы имеете в виду что-то вроде этого:

<Address addressType="R">
    <Formatted xmlns="cds_dt">
        <xsl:value-of select="concat(Line1, ', ', City, PostalZipCode/PostalCode )"/>
    </Formatted>
</Address>

Примечание. Я сократил пути аргументов до concat() для удобства чтения. Так что вместо Line1 должно быть Address/Structured/Line1.

person alex    schedule 02.03.2012
comment
Пожалуйста, не публикуйте непроверенный код — он не дает желаемого результата. - person Dimitre Novatchev; 03.03.2012