XSLT: Как сгладить структуру в XML с помощью XSLT 1 - PullRequest
2 голосов
/ 03 марта 2012

Я пытаюсь свести иерархию / структуру к 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> 

Ответы [ 2 ]

3 голосов
/ 03 марта 2012

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

<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> инструкция.

0 голосов
/ 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.

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