3

我难住了。给定一个 xml 文档,例如:

    <Frag>
        <DirRef Id="BeemzDir">
            <Com Id="BEED24F05AB78FB588F61D4092654B6D" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
                <FileName Id="fil1" KeyPath="yes" Source="My.Exe" />
            </Com>
            <Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
                <FileName Id="fil2" KeyPath="yes" Source="My.Dll" />
            </Com> 
          </DirRef>
</Frag>
<Frag>
        <ComGroup Id="MyGroup">
            <CompRef Id="BEED24F05AB78FB588F61D4092654B6D" />
            <CompRef Id="FFF24F05AB78FB588F61D4092654CCC" />
        </ComGroup>  
</Frag> 

我需要使用 xslt 来删除包含 Source="My.Exe" 的元素。在这种情况下,删除其属性 id=BEED24F05AB78FB588F61D4092654B6D 的元素“Com”。

我已经做到了。但我不能做的是删除Id = BEED24F05AB78FB588F61D4092654B6D的“CompRef”元素。

因此,转换后我希望我的 xml 看起来像:

    <Frag>
        <DirRef Id="BeemzDir">
            <Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
                <FileName Id="fil2" KeyPath="yes" Source="My.Dll" />
            </Com> 
          </DirRef>
</Frag>
<Frag>
        <ComGroup Id="MyGroup">
            <CompRef Id="FFF24F05AB78FB588F61D4092654CCC" />
        </ComGroup>  
</Frag> 

任何帮助,将不胜感激。

更新

这是一些删除“FileName”元素的xml。

  <xsl:template match="Com/FileName[contains(@Source,'My.Exe')='true']">
  </xsl:template>

所以结果是:

<Frag>
    <DirRef Id="BeemzDir">
        <Com Id="BEED24F05AB78FB588F61D4092654B6D" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">

        </Com>
        <Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
            <FileName Id="fil2" KeyPath="yes" Source="My.Dll" />
        </Com> 
          </DirRef>
</Frag>
<Frag>
        <ComGroup Id="MyGroup">
            <CompRef Id="BEED24F05AB78FB588F61D4092654B6D" />
            <CompRef Id="FFF24F05AB78FB588F61D4092654CCC" />
        </ComGroup>  
</Frag>

更改调用 xsl:apply-template 的上述 xsl 没有任何作用,因为它卡在其运行的节点中。我不知道如何存储要删除的 Id,然后循环遍历它们。

更新 2

可以删除多个节点,即 source="MyExe" 的多个“Com”元素。此外,ID 是自动生成的,因此每次运行都会有所不同。

4

2 回答 2

5

这种转变

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

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

 <xsl:template match="Com[FileName/@Source='My.Exe']"/>

 <xsl:template match="CompRef[@Id=/*/*/*/Com[FileName/@Source='My.Exe']/@Id]"/>

</xsl:stylesheet>

当应用于提供的 XML 文档时(更正为格式正确):

<Frags>
    <Frag>
        <DirRef Id="BeemzDir">
            <Com Id="BEED24F05AB78FB588F61D4092654B6D" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
                <FileName Id="fil1" KeyPath="yes" Source="My.Exe" />
            </Com>
            <Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
                <FileName Id="fil2" KeyPath="yes" Source="My.Dll" />
            </Com>
        </DirRef>
    </Frag>
    <Frag>
        <ComGroup Id="MyGroup">
            <CompRef Id="BEED24F05AB78FB588F61D4092654B6D" />
            <CompRef Id="FFF24F05AB78FB588F61D4092654CCC" />
        </ComGroup>
    </Frag>
</Frags>

产生所需的正确输出

<Frags>
    <Frag>
        <DirRef Id="BeemzDir">
            <Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
                <FileName Id="fil2" KeyPath="yes" Source="My.Dll"/>
            </Com>
        </DirRef>
    </Frag>
    <Frag>
        <ComGroup Id="MyGroup">
            <CompRef Id="FFF24F05AB78FB588F61D4092654CCC"/>
        </ComGroup>
    </Frag>
</Frags>
于 2010-06-30T18:34:28.797 回答
-1

这确实很快且未经测试,但您希望选择器属性不等于一个值:

<xsl:template match="node()[!@Id='BEED24F05AB78FB588F61D4092654B6D']">
  <xsl:copy><xsl:apply-templates/></xsl:copy>
</xsl:template>

<xsl:template match="frag"/>

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

</xsl:stylesheet>
于 2010-06-30T16:13:33.840 回答