Удаление определенных элементов XML через XSLT - PullRequest
0 голосов
/ 06 октября 2009

Моя проблема: у меня есть файл XML, в котором я хочу удалить некоторые дочерние элементы, не удаляя родителей. Может ли кто-нибудь помочь мне получить результат с помощью ASP.NET?

Вот мой XML-файл:

<Jobs> 
  <Job>
    <Title></Title>
    <Summary</Summary>
    <DateActive>9/28/2009</DateActive>
   <DateExpires>10/28/2009</DateExpires>
   <DateUpdated>9/28/2009</DateUpdated>
    <Location>
      <Country>India</Country>
      <State>xxx</State>
      <City>xxx</City>
      <PostalCode>xxx</PostalCode>
    </Location>
    <CompanyName>Finance</CompanyName>
    <Salary>
      <Max>70,000.00</Max>
      <Type>Per Year</Type>
      <Currency>Dollar</Currency>
    </Salary>
    <BuilderFields />
    <DisplayOptions />
    <AddressType>6</AddressType>
    <Job_Id>123456</Job_Id>
  </Job>

Сверху XML Я хочу удалить только элементы <Location> и <Salary>, не удаляя их дочерние узлы. Как бы я использовал XSLT для получения желаемого результата в XML-файле?

1 Ответ

5 голосов
/ 06 октября 2009

Вы можете использовать шаблон применения преобразования идентичности для копирования всего и переопределения этого для узлов элементов Location и Salary, не копируя их, а просто обрабатывая их потомки.

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

  <!-- default: copy everything using the identity transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- override: for Location and Salary elements, just process the children -->
  <xsl:template match="Location|Salary">
    <xsl:apply-templates select="node()"/>
  </xsl:template>

</xsl:stylesheet>

Обновлено для вашего последующего вопроса. Из вашего примера немного неясно, что еще вы на самом деле хотите сделать, но при условии, что в дополнение к вышесказанному вы также захотите:

  1. Для некоторых элементов преобразовать атрибуты в дочерние элементы. Это можно сделать, добавив дополнительное правило переопределения, которое соответствует атрибутам и элементам вывода.

  2. Для некоторых других элементов вообще удалите атрибуты. Вы можете сделать это так же, как описано выше, но на этот раз просто используйте пустой шаблон, который ничего не выводит.

  3. Вывести содержимое некоторых элементов, используя CDATA секции . Вы можете указать такие элементы с атрибутом cdata-section-elements xsl:output.

Пример таблицы стилей, демонстрирующий все это:

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

  <xsl:output method="xml" indent="yes" media-type="application/xml"
              cdata-section-elements="Summary"/>

  <!-- default: copy everything using the identity transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- override: for Location and Salary nodes, just process the children -->
  <xsl:template match="Location|Salary">
    <xsl:apply-templates select="node()"/>
  </xsl:template>

  <!-- override: for selected elements, convert attributes to elements -->
  <xsl:template match="Jobs/@*|Job/@*">
    <xsl:element name="{name()}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

  <!-- override: for selected elements, remove attributes -->
  <xsl:template match="DateActive/@*|DateExpires/@*|DateUpdated/@*"/>

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