Xml 删除具有';的子元素值通过XSLT为0

Xml 删除具有';的子元素值通过XSLT为0,xml,xslt,Xml,Xslt,我有一个需要用XSLT转换的xml文件。在我的XSLT文件中,我使用xml文件做了很多事情。我首先复制所有元素;然后我重命名了一些元素。最后,我需要为输出删除经销商代码名为0的任何经销商代码元素。前两段代码我都在工作,但我已经尝试了我在网上找到的每一段代码,似乎无法删除那些违规的经销商代码元素。我是XSLT新手,所以可能做得都不对;任何帮助都将不胜感激 部分xml代码: <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

我有一个需要用XSLT转换的xml文件。在我的XSLT文件中,我使用xml文件做了很多事情。我首先复制所有元素;然后我重命名了一些元素。最后,我需要为输出删除
经销商代码名
为0的任何
经销商代码元素
。前两段代码我都在工作,但我已经尝试了我在网上找到的每一段代码,似乎无法删除那些违规的
经销商代码
元素。我是XSLT新手,所以可能做得都不对;任何帮助都将不胜感激

部分xml代码:

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

2.
2.
12042010
南广场-跟踪者广告
49996
A20
真的
0
真的

我的xslt:

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

交易代码
重命名为
经销商代码
有效。但是,不输出值为0的任何
经销商代码名
的最后一个零件不会。我生成的xml文件仍然列出了每个
经销商代码
元素。

您有两个问题:

  • 源XML中没有任何
    经销商代码
    元素。它们是
    deal-code0
    deal-code1
  • 经销商代码名
    是一个元素,而不是一个属性 您的XPATH当前将
    dealer code
    元素与
    @dealer code name='0'
    匹配。由于没有
    经销商代码
    元素,也没有
    经销商代码名称
    属性,因此它从不匹配,也不会抑制内容

    您需要调整XPATH以匹配
    交易代码
    元素,类似于您在另一个模板中的情况,并为子元素
    经销商代码名
    添加一个附加谓词过滤器,其值为0。此外,由于两个模板具有相似的匹配逻辑,因此它们可能具有相同的优先级。您可能需要提高此编校模板的优先级,以便它“赢得”更一般的匹配:

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

  • 源XML中没有任何
    经销商代码
    元素。它们是
    deal-code0
    deal-code1
  • 经销商代码名
    是一个元素,而不是一个属性 您的XPATH当前将
    dealer code
    元素与
    @dealer code name='0'
    匹配。由于没有
    经销商代码
    元素,也没有
    经销商代码名称
    属性,因此它从不匹配,也不会抑制内容

    您需要调整XPATH以匹配
    交易代码
    元素,类似于您在另一个模板中的情况,并为子元素
    经销商代码名
    添加一个附加谓词过滤器,其值为0。此外,由于两个模板具有相似的匹配逻辑,因此它们可能具有相同的优先级。您可能需要提高此编校模板的优先级,以便它“赢得”更一般的匹配:

     <xsl:template match="*[starts-with(name(), 'deal-code') and dealer-code-name='0']" priority="1"/>
    
    
    
    
    
    您的输入xml中没有元素
    经销商代码
    ,但您可以在处理以
    交易代码
    开头的元素时进行筛选,方法是测试这些元素是否具有值为0的子元素
    经销商代码名
  • 您的输入xml中没有元素
    经销商代码
    ,但您可以在处理以
    交易代码
    开头的元素时进行筛选,方法是测试这些元素是否有子元素
    经销商代码名
    ,其值为0

    此输入:

    <?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>
    
    
    2.
    2.
    12042010
    南广场-跟踪者广告
    49996
    A20
    真的
    0
    真的
    
    使用此样式表:

    <?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>
    
    
    2.
    2.
    12042010
    南广场-跟踪者广告
    49996
    A20
    真的
    
    此输入:

    <?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>
    
    
    2.
    2.
    12042010
    南广场-跟踪者广告
    49996
    A20
    真的
    0
    真的
    
    使用此样式表:

    <?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>
    
    
    2.
    2.
    12042010
    南广场-跟踪者广告
    49996
    A20
    真的
    
    请使用代码格式({}-按钮)对源代码进行格式设置,以便我们可以正确查看源代码。请使用代码格式({}-按钮)对源代码进行格式设置,以便我们可以正确查看源代码。请尝试使用代码格式设置({}-按钮)对源代码进行格式设置。更改线路以删除@