XML в XML с XSLT, исключая определенные элементы на основе значения - PullRequest
4 голосов
/ 23 октября 2011

Я пытаюсь создать xml-файл, который в значительной степени идентичен исходному, но мне нужен мой xsl-лист, чтобы преобразовать его, чтобы он включал только файлы с из 'apartment' или 'unit' и Я имею значение больше 1 в Я полностью потерян, любая помощь будет принята с благодарностью!

мой исходный лист XML выглядит следующим образом:

<rentalProperties> 
<property available="yes" contact="0423020892"> 
    <type>house</type> 
    <price>800</price> 
    <address> 
        <streetNo>116</streetNo> 
        <street>Warrigal Road</street> 
        <suburb>Camberwell</suburb> 
        <state>VIC</state> 
    <zipcode>3124</zipcode>
    </address> 
    <numberOfBedrooms>4</numberOfBedrooms> 
    <description>Ideal for the familly is this charming Californian Bungalow. Comprising a spacious living area, formal dining room plus a huge family/meals area, bright modern well appointed kitchen with dishwasher, gas cooktop and electric oven and heaps of bench space, Four double bedrooms, two in a wing of their own, are served by a stylishly renovated central bathroom and second sky-lit bathroom to the rear.</description>
</property>
</rentalproperties>

Мой xsl:

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
<xsl:element name="RentalProperties">
   <xsl:apply-templates select="rentalProperties/property"/>
</xsl:element>
</xsl:template>

<xsl:template match="rentalProperties/property/type">
<xsl:element name="type" >
  <xsl:value-of select="."/>
</xsl:element>
</xsl:template>

<xsl:template match="rentalProperties/property/price">
<xsl:element name="price" >
  <xsl:value-of select="."/>
</xsl:element>
</xsl:template>

<xsl:template match="rentalProperties/property/address">
<xsl:element name="address" >
  <xsl:value-of select="streetNo"/><xsl:value-of select="street"/><xsl:value-of select="suburb"/><xsl:value-of select="state"/><xsl:value-of select="zipcode"/>
</xsl:element>
</xsl:template>

<xsl:template match="rentalProperties/property/numberOfBedrooms">
<xsl:element name="numberOfBedrooms" >
  <xsl:value-of select="."/>
</xsl:element>
</xsl:template>

<xsl:template match="rentalProperties/property/description">
<xsl:element name="description" >
  <xsl:value-of select="."/>
</xsl:element>
</xsl:template>

Вывод будет выглядеть примерно так:

<RentalProperties>
<property>
<type>apartment</type>
<price>400</price>
<address>4/3,Acheron Avenue,Camberwell,VIC,3124, Australia</address>
<numberOfBedrooms>2</numberOfBedrooms>
<description>This two bedroom apartment is located in quiet tree lined street, just minutes from tram and easy walk to Camberwell Junction and train. Positioned on the 1st floor with sunny north facing lounge and balcony.
</description>
</property>
</RentalProperties>

Спасибо

Ответы [ 2 ]

3 голосов
/ 23 октября 2011

Это, вероятно, одно из самых простых возможных решений (никаких явных условий вообще нет, весь вывод создается только шаблоном идентификации) :

<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=
 "property
   [not(contains('|unit|apartment|',
                 concat('|',type,'|')
                 )
        )
    or
     not(numberOfBedrooms > 1)
   ]
 "/>
</xsl:stylesheet>

при применении к этому XML-документу (предоставленный - исправленный и увеличенный):

<rentalProperties>
<property available="yes" contact="0423020892">
    <type>house</type>
    <price>800</price>
    <address>
        <streetNo>116</streetNo>
        <street>Warrigal Road</street>
        <suburb>Camberwell</suburb>
        <state>VIC</state>
    <zipcode>3124</zipcode>
    </address>
    <numberOfBedrooms>4</numberOfBedrooms>
    <description>Ideal for the familly is this charming Californian Bungalow. Comprising a spacious living area, formal dining room plus a huge family/meals area, bright modern well appointed kitchen with dishwasher, gas cooktop and electric oven and heaps of bench space, Four double bedrooms, two in a wing of their own, are served by a stylishly renovated central bathroom and second sky-lit bathroom to the rear.</description>
</property>
<property available="yes" contact="0423020899">
    <type>apartment</type>
    <price>500</price>
    <address>
        <streetNo>116</streetNo>
        <street>Water St.</street>
        <suburb>Hornsby</suburb>
        <state>NSW</state>
    <zipcode>2012</zipcode>
    </address>
    <numberOfBedrooms>2</numberOfBedrooms>
    <description>Ideal for the familly is this charming Californian Bungalow. Comprising a spacious living area, formal dining room plus a huge family/meals area, bright modern well appointed kitchen with dishwasher, gas cooktop and electric oven and heaps of bench space, Four double bedrooms, two in a wing of their own, are served by a stylishly renovated central bathroom and second sky-lit bathroom to the rear.</description>
</property>
<property available="yes" contact="0423011111">
    <type>unit</type>
    <price>800</price>
    <address>
        <streetNo>7</streetNo>
        <street>Ryan St</street>
        <suburb>Isacs</suburb>
        <state>ACT</state>
    <zipcode>2603</zipcode>
    </address>
    <numberOfBedrooms>1</numberOfBedrooms>
    <description>Ideal for the familly is this charming Californian Bungalow. Comprising a spacious living area, formal dining room plus a huge family/meals area, bright modern well appointed kitchen with dishwasher, gas cooktop and electric oven and heaps of bench space, Four double bedrooms, two in a wing of their own, are served by a stylishly renovated central bathroom and second sky-lit bathroom to the rear.</description>
</property>
<property available="yes" contact="04231234567">
    <type>hotel</type>
    <price>1200</price>
    <address>
        <streetNo>4</streetNo>
        <street>Bench St.</street>
        <suburb>Deakin</suburb>
        <state>ACT</state>
    <zipcode>2600</zipcode>
    </address>
    <numberOfBedrooms>4</numberOfBedrooms>
    <description>Ideal for the familly is this charming Californian Bungalow. Comprising a spacious living area, formal dining room plus a huge family/meals area, bright modern well appointed kitchen with dishwasher, gas cooktop and electric oven and heaps of bench space, Four double bedrooms, two in a wing of their own, are served by a stylishly renovated central bathroom and second sky-lit bathroom to the rear.</description>
</property>
</rentalProperties>

дает требуемый, правильный результат (выводится только одно из свойств, удовлетворяющих всем ограничениям):

<rentalProperties>
   <property available="yes" contact="0423020899">
      <type>apartment</type>
      <price>500</price>
      <address>
         <streetNo>116</streetNo>
         <street>Water St.</street>
         <suburb>Hornsby</suburb>
         <state>NSW</state>
         <zipcode>2012</zipcode>
      </address>
      <numberOfBedrooms>2</numberOfBedrooms>
      <description>Ideal for the familly is this charming Californian Bungalow. Comprising a spacious living area, formal dining room plus a huge family/meals area, bright modern well appointed kitchen with dishwasher, gas cooktop and electric oven and heaps of bench space, Four double bedrooms, two in a wing of their own, are served by a stylishly renovated central bathroom and second sky-lit bathroom to the rear.</description>
   </property>
</rentalProperties>

Объяснение : переопределение правила идентификации с пустым шаблоном, соответствующим любому нежелательному свойству.

0 голосов
/ 23 октября 2011
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="property">
    <xsl:if test="normalize-space(./type/text()) = 'unit' or normalize-space(./type/text()) = 'apartment'">
      <xsl:copy-of select="."/>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Приведенный выше xml копирует все для вывода, но в случае элемента «property» копирует его только в том случае, если тип содержит текст квартиры или единицы.Я надеюсь, что дал вам подсказку ..

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