使用xslt基于值删除特定元素

时间:2017-07-11 18:07:29

标签: xml xslt xslt-1.0

使用xslt,我想删除没有part的所有partid元素等于<RtoP>的子元素。

<tran>
<part>
<Partid>123
</Partid>
</part>
<part>
<Partid>200
</Partid>
</part>
<part>
<Partid>777
</Partid>
</part>
<refs>
<RtoP>
<partid>200</partid>
</RtoP>
</refs>
</tran>

结果是

<tran>
<part>
<Partid>200
</Partid>
</part>
<refs>
<RtoP>
<partid>200</partid>
</RtoP>
<refs>
</tran>

请协助如何在xslt中执行此操作。

1 个答案:

答案 0 :(得分:1)

尝试从身份模板开始,添加一个空part元素的空模板,该partid元素不等于RtoP的{​​{1}}个孩子......

<xsl:stylesheet version="1.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="part[normalize-space(Partid) != normalize-space(/tran/refs/RtoP/partid)]"/>

</xsl:stylesheet>

如果可能有多个RtoP元素或多个RtoP子元素,请考虑使用xsl:key ...

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

  <xsl:key name="keep" match="RtoP/*" use="normalize-space()"/>

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

  <xsl:template match="part[not(key('keep',normalize-space()))]"/>

</xsl:stylesheet>

编辑:来自http://xsltransform.net/93dEHG6/8的最新输入/ xslt /输出示例

<强>输入

<my:TRAN xmlns:my="himom" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <my:DAY>
    <my:LANE>
      <my:LANEID>900</my:LANEID>
    </my:LANE>
    <my:COT>
      <my:place>
        <my:PR>
          <my:RID>253503</my:RID>
        </my:PR>
        <my:Acreage>0</my:Acreage>
        <my:City>Mars</my:City>
      </my:place>
      <my:COTID>31263</my:COTID>
    </my:COT>
     <my:PART>
       <my:PARTId>123</my:PARTId>
     </my:PART>
    <my:PART>
      <my:PARTId>200</my:PARTId>
    </my:PART>
    <my:PART>
      <my:PARTId>777</my:PARTId>
    </my:PART>
    <my:REFERENCES>
      <my:RToP>
        <my:RID>253503</my:RID>
        <my:PARTId>200</my:PARTId>
        <my:PARTRoleType>B</my:PARTRoleType>
      </my:RToP>
      <my:RToP>
        <my:RID>253503</my:RID>
        <my:PARTId>134175</my:PARTId>
        <my:PARTRoleType>I</my:PARTRoleType>
      </my:RToP>
      <my:RToP>
        <my:RID>253503</my:RID>
        <my:PARTId>777</my:PARTId>
        <my:PARTRoleType>R</my:PARTRoleType>
      </my:RToP>
      <my:RToP>
        <my:RID>253503</my:RID>
        <my:PARTId>121871</my:PARTId>
        <my:PARTRoleType>S</my:PARTRoleType>
      </my:RToP>
      <my:RToP>
        <my:RID>253503</my:RID>
        <my:PARTId>87372</my:PARTId>
        <my:PARTRoleType>IC</my:PARTRoleType>
      </my:RToP>
        <my:RToP>
        <my:RID>253504</my:RID>
        <my:PARTId>123</my:PARTId>
        <my:PARTRoleType>IC</my:PARTRoleType>
      </my:RToP>
    </my:REFERENCES>
    <my:DAYIdentifier />
  </my:DAY>
</my:TRAN>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="himom">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="keep" 
    match="my:RToP[normalize-space(my:RID) = normalize-space(/my:TRAN/my:DAY/my:COT/my:place/my:PR/my:RID)]" 
    use="normalize-space(my:PARTId)"/>  

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

  <xsl:template match="my:RToP[normalize-space(my:RID) != normalize-space(/my:TRAN/my:DAY/my:COT/my:place/my:PR/my:RID)]"/>

  <xsl:template match="my:PART[not(key('keep',normalize-space(my:PARTId)))]"/>

</xsl:stylesheet>

<强>输出

<my:TRAN xmlns:my="himom" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <my:DAY>
      <my:LANE>
         <my:LANEID>900</my:LANEID>
      </my:LANE>
      <my:COT>
         <my:place>
            <my:PR>
               <my:RID>253503</my:RID>
            </my:PR>
            <my:Acreage>0</my:Acreage>
            <my:City>Mars</my:City>
         </my:place>
         <my:COTID>31263</my:COTID>
      </my:COT>
      <my:PART>
         <my:PARTId>200</my:PARTId>
      </my:PART>
      <my:PART>
         <my:PARTId>777</my:PARTId>
      </my:PART>
      <my:REFERENCES>
         <my:RToP>
            <my:RID>253503</my:RID>
            <my:PARTId>200</my:PARTId>
            <my:PARTRoleType>B</my:PARTRoleType>
         </my:RToP>
         <my:RToP>
            <my:RID>253503</my:RID>
            <my:PARTId>134175</my:PARTId>
            <my:PARTRoleType>I</my:PARTRoleType>
         </my:RToP>
         <my:RToP>
            <my:RID>253503</my:RID>
            <my:PARTId>777</my:PARTId>
            <my:PARTRoleType>R</my:PARTRoleType>
         </my:RToP>
         <my:RToP>
            <my:RID>253503</my:RID>
            <my:PARTId>121871</my:PARTId>
            <my:PARTRoleType>S</my:PARTRoleType>
         </my:RToP>
         <my:RToP>
            <my:RID>253503</my:RID>
            <my:PARTId>87372</my:PARTId>
            <my:PARTRoleType>IC</my:PARTRoleType>
         </my:RToP>
      </my:REFERENCES>
      <my:DAYIdentifier/>
   </my:DAY>
</my:TRAN>