通过XSLT删除子元素值为0的元素

时间:2011-01-18 14:31:38

标签: xml xslt

我有一个xml文件,我需要使用XSLT进行转换。在我的XSLT文件中,我正在使用xml文件执行许多操作。我先复制所有元素;然后我重命名了一些元素。最后,我需要删除输出dealer-code element dealer-code-namedealer-code的任何 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml-stylesheet type="text/xsl" href="xmlstructure.xsl"?> <AdBaseData> <AdBasePreprintInfo FromDistribute="true"> <PreprintInsert> <Sides>2</Sides> <PageCount>2</PageCount> <InsertSchedule> <AdLocInfo> <rundates> <date>12042010</date> </rundates> </AdLocInfo> <invoice-text>South Plaza - Stalker Advertisin</invoice-text> <BillingOverride Type="Subscriber">49996</BillingOverride> <deal-code0> <dealer-code-name>A20</dealer-code-name> <Delivery-Method Type="Subscriber"> <Selected>true</Selected> </Delivery-Method> </deal-code0> <deal-code1> <dealer-code-name>0</dealer-code-name> <Delivery-Method Type="Subscriber"> <Selected>true</Selected> </Delivery-Method> </deal-code1> </InsertSchedule> </PreprintInsert> 。我工作的前两部分,但我已经尝试了我在网上发现的每一段代码都不能似乎删除了那些有问题的 <?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" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="*[starts-with(name(), 'deal-code')]"> <xsl:element name="dealer-code"> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match="dealer-code[@dealer-code-name='0']"> </xsl:template> </xsl:stylesheet> 元素。我是XSLT的新手,所以我可能做错了;任何帮助将不胜感激。

部分xml代码:

deal-code

  

我的xslt:

dealer-code

dealer-code-name重命名为dealer-code有效。但是,不输出值为0的任何{{1}}的最后一部分不会。我生成的xml文件仍会列出每个{{1}}元素。

3 个答案:

答案 0 :(得分:1)

此输入:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="xmlstructure.xsl"?>
<AdBaseData>
  <AdBasePreprintInfo FromDistribute="true">
    <PreprintInsert>
      <Sides>2</Sides>
      <PageCount>2</PageCount>
      <InsertSchedule>
        <AdLocInfo>
          <rundates>
            <date>12042010</date>
          </rundates>
        </AdLocInfo>
        <invoice-text>South Plaza - Stalker Advertisin</invoice-text>
        <BillingOverride Type="Subscriber">49996</BillingOverride>
        <deal-code0>
          <dealer-code-name>A20</dealer-code-name>
          <Delivery-Method Type="Subscriber">
            <Selected>true</Selected>
          </Delivery-Method>
        </deal-code0>
        <deal-code1>
          <dealer-code-name>0</dealer-code-name>
          <Delivery-Method Type="Subscriber">
            <Selected>true</Selected>
          </Delivery-Method>
        </deal-code1>
      </InsertSchedule>
    </PreprintInsert>
  </AdBasePreprintInfo>
</AdBaseData>

使用此样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="*[starts-with(name(), 'deal-code')][dealer-code-name = '0']"/>

</xsl:stylesheet>

产生你想要的输出:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xmlstructure.xsl"?><AdBaseData>
   <AdBasePreprintInfo FromDistribute="true">
      <PreprintInsert>
         <Sides>2</Sides>
         <PageCount>2</PageCount>
         <InsertSchedule>
            <AdLocInfo>
               <rundates>
                  <date>12042010</date>
               </rundates>
            </AdLocInfo>
            <invoice-text>South Plaza - Stalker Advertisin</invoice-text>
            <BillingOverride Type="Subscriber">49996</BillingOverride>
            <deal-code0>
               <dealer-code-name>A20</dealer-code-name>
               <Delivery-Method Type="Subscriber">
                  <Selected>true</Selected>
               </Delivery-Method>
            </deal-code0>
         </InsertSchedule>
      </PreprintInsert>
   </AdBasePreprintInfo>
</AdBaseData>

答案 1 :(得分:0)

你有两个问题:

  1. 源XML中没有任何dealer-code个元素。它们是deal-code0deal-code1
  2. dealer-code-name是一个元素,而不是一个属性。
  3. 您的XPATH目前将dealer-code元素与@dealer-code-name='0'匹配。由于没有dealer-code个元素且没有dealer-code-name个属性,因此它永远不会匹配,也不会抑制内容。

    您需要调整XPATH以匹配deal-code元素,类似于您在其他模板中的方式,并为子元素dealer-code-name添加额外的谓词过滤器,其值为0.此外,您的两个模板都具有相似的匹配逻辑,它们可能会获得相同的优先级。您可能需要提高此编校模板的优先级,以便它对更通用的匹配“胜出”:

     <xsl:template match="*[starts-with(name(), 'deal-code') and dealer-code-name='0']" priority="1"/>
    

答案 2 :(得分:0)

<?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" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="@* | node()">
     <xsl:copy>
       <xsl:apply-templates select="@* | node()"/>
     </xsl:copy>
  </xsl:template>
  <xsl:template match="*[starts-with(name(), 'deal-code')]">
     <xsl:if test="dealer-code-name!='0']">
       <xsl:element name="dealer-code">
       <xsl:apply-templates/>
       </xsl:element>
     </xsl:if>
  </xsl:template>
</xsl:stylesheet>

您的输入xml中没有元素dealer-code,但您可以通过测试处理元素是否以deal-code开头来测试它们是否具有值为0的子元素dealer-code-name / p>