Преобразование XML с использованием XSLT - PullRequest
1 голос
/ 12 июня 2011

Я хочу преобразовать XML с помощью XSLT Вот мой пример XML

<EmployeList>
  <EMpDetails>
    <Name>Kiran</Name>
    <ID>ID001</ID>
    <city>Hyderabad</city>
    <Country>India</Country>
  </EMpDetails>
  <EMpDetails>
    <Name>Sunny</Name>
    <ID>ID002</ID>
    <city>Banglore</city>
    <Country>INDIA</Country>
  </EMpDetails>
  <EMpDetails>
    <Name>John</Name>
    <ID>ID001</ID>
    <city>TEXAS</city>
    <Country>US</Country>
  </EMpDetails>
  <EMpDetails>
    <Name>Raj</Name>
    <ID>ID006</ID>
    <city>Dallas</city>
    <Country>US</Country>
  </EMpDetails>
  <EMpDetails>
    <Name>Nag</Name>
    <ID>ID007</ID>
    <city>ITALY</city>
    <Country>Rome</Country>
  </EMpDetails>
</EmployeList>

Требуемый вывод с использованием XSLT

<EmployeList>
  <EMpDetails>
    <Name>Kiran</Name>
    <ID>ID001</ID>
    <city>Hyderabad</city>
    <Country>India</Country>
  </EMpDetails>
  <EMpDetails>
    <Name>Sunny</Name>
    <ID>ID002</ID>
    <city>Banglore</city>
    <Country>INDIA</Country>
  </EMpDetails>   
</EmployeList>

Ответы [ 3 ]

1 голос
/ 12 июня 2011

Предполагая, что вопрос требует вывода только EMpDetails, у которого Country child имеет строковое (без учета регистра) значение "India":

I. Это XSLT 1.0 преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <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=
 "EMpDetails
    [not(translate(Country,
                   'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                   'abcdefghijklmnopqrstuvwxyz'
                   )
         ='india'
         )
    ]
 "/>
</xsl:stylesheet>

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

<EmployeList>
    <EMpDetails>
        <Name>Kiran</Name>
        <ID>ID001</ID>
        <city>Hyderabad</city>
        <Country>India</Country>
    </EMpDetails>
    <EMpDetails>
        <Name>Sunny</Name>
        <ID>ID002</ID>
        <city>Banglore</city>
        <Country>INDIA</Country>
    </EMpDetails>
    <EMpDetails>
        <Name>John</Name>
        <ID>ID001</ID>
        <city>TEXAS</city>
        <Country>US</Country>
    </EMpDetails>
    <EMpDetails>
        <Name>Raj</Name>
        <ID>ID006</ID>
        <city>Dallas</city>
        <Country>US</Country>
    </EMpDetails>
    <EMpDetails>
        <Name>Nag</Name>
        <ID>ID007</ID>
        <city>ITALY</city>
        <Country>Rome</Country>
    </EMpDetails>
</EmployeList>

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

<EmployeList>
   <EMpDetails>
      <Name>Kiran</Name>
      <ID>ID001</ID>
      <city>Hyderabad</city>
      <Country>India</Country>
   </EMpDetails>
   <EMpDetails>
      <Name>Sunny</Name>
      <ID>ID002</ID>
      <city>Banglore</city>
      <Country>INDIA</Country>
   </EMpDetails>
</EmployeList>

II. Это XSLT 2.0 преобразование:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <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=
 "EMpDetails[not(upper-case(Country)='INDIA')]"/>
</xsl:stylesheet>

снова дает тот же, желаемый и правильный результат .

Объяснение : Переопределение правила идентификации с помощью шаблона, соответствующего всем нежелательным EMpDetails элементам. Этот шаблон имеет пустое тело, что эффективно предотвращает копирование любых соответствующих элементов в вывод.

Помните : Использование и переопределение правила / шаблона идентификации является наиболее фундаментальным и мощным шаблоном проектирования XSLT.

0 голосов
/ 12 июня 2011

Предполагая, что ваш пример ввода прост, как показано, вы также можете пойти с:

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

    <xsl:template match="/EmployeList">
        <xsl:copy>
            <xsl:copy-of select="EMpDetails[
                Country[
                .='India'
                or .='INDIA']
                ]"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
0 голосов
/ 12 июня 2011

Это должно работать, как вам нужно (при условии, что вы хотите, чтобы все EMpDetails элементы, где Country равен India с учетом регистра):

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

    <xsl:template match="EmployeList">
        <EmployeList>
            <xsl:copy-of select="EMpDetails[lower-case(Country) = 'india']"/>
        </EmployeList>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...