通过XSLT删除某些XML元素

时间:2009-10-06 10:30:30

标签: .net asp.net xslt

我的问题是:我有一个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 个答案:

答案 0 :(得分:5)

您可以使用应用identity transform的模式来复制所有内容,并覆盖LocationSalary元素节点,而不是复制它们,只是处理它们的子节点。

<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输出某些元素的内容。您可以使用xsl:outputcdata-section-elements属性指定此类元素。

  4. 演示所有内容的示例样式表:

    <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>