Правильный xsl для данного xml? - PullRequest
2 голосов
/ 24 декабря 2010

Мой xml -

     <?xml version='1.0'?>
     <?xml-stylesheet type="text/xsl" href="country.xsl"?>
     <countries>
       <country name="india">
           <name>Rajan</name>
           <pop>90.09</pop>
           <car>Audi</car>
       </country>
       <country name="japan">
          <name>Yenhovong</name>
          <pop>172</pop>
          <car>Sumo</car>
       </country>
      </countries>

Здесь я хочу отобразить элементы

название страны = "япония"

, используя xslt.Но я не знаю, соответствует ли атрибут в xslt.Помогите, спасибо заранее

Ответы [ 2 ]

1 голос
/ 24 декабря 2010

Выражение Xpath для него будет country[@name = 'japan'].

XML

<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="country.xsl"?>
<countries>
    <country name="india">
        <name>Rajan</name>
        <pop>90.09</pop>
        <car>Audi</car>
    </country>
    <country name="japan">
        <name>Yenhovong</name>
        <pop>172</pop>
        <car>Sumo</car>
    </country>
</countries>

1010 * XSL *

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="country[@name = 'japan']">
        <xsl:copy-of select="."/>
    </xsl:template>

    <xsl:template match="country"/>
</xsl:stylesheet>

РЕЗУЛЬТАТ

<?xml version="1.0" encoding="utf-8"?>
<country name="japan">
    <name>Yenhovong</name>
    <pop>172</pop>
    <car>Sumo</car>
</country>
0 голосов
/ 24 декабря 2010

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

<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="*[not(ancestor-or-self::country)]">
  <xsl:apply-templates/>
 </xsl:template>
 <xsl:template match="country[not(@name='japan')]"/>
</xsl:stylesheet>

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

<countries>
    <country name="india">
        <name>Rajan</name>
        <pop>90.09</pop>
        <car>Audi</car>
    </country>
    <country name="japan">
        <name>Yenhovong</name>
        <pop>172</pop>
        <car>Sumo</car>
    </country>
</countries>

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

<country name="japan">
   <name>Yenhovong</name>
   <pop>172</pop>
   <car>Sumo</car>
</country>

Примечание :

  1. Правило идентификации используется для копирования каждого требуемого узла "как есть". Использование и переопределение шаблона идентификации является наиболее фундаментальным шаблоном проектирования XSLT.

  2. Один шаблон переопределяет правило идентификации для любого элемента, который имеет country предка или сам по себе не является элементом country. Такие элементы не копируются в вывод, но их дочерние узлы обрабатываются.

  3. Переопределяющий шаблон, соответствующий любому элементу country, атрибут которого name не равен 'japan'. У него пустое тело, поэтому любые такие элементы игнорируются / удаляются / не копируются.

  4. Результат от 1 до 3 выше заключается в том, что только элемент country, атрибут name которого 'japan', обрабатывается шаблоном идентификации и копируется в выходной файл.

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