2009-10-06 4 views
0

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

Вот мой 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?

+0

Это не достаточно ясно, что вы пытаетесь удалить. Не могли бы вы уточнить? –

ответ

5

Вы можете использовать схему применения identity transform скопировать все, и переопределение, что для узлов элементов 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 sections. Вы можете указать такие элементы с атрибутом cdata-section-elementsxsl: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> 
Смежные вопросы