当前位置: 首页 > 知识库问答 >
问题:

XSLT:For each with condition

缑赤岩
2023-03-14

目前,当我通过XSLT转换XML时,它为所有节点生成,但我希望根据以下条件输出

对于任何节点,当Reason\u code=AA时,检查Auth1的值,并将其带到前一个节点,并捕获同一节点中其他标记的值。请告知

输入XML:

<?xml version='1.0' encoding='utf-8'?>
<ns0:File xmlns:ns0="http://yourcompany.com/textschema/mapping/item.xsd">
    <Detail>
        <empty1>75500013</empty1>
        <empty2>00001N</empty2>
        <Reason_Code>B6</Reason_Code>
    </Detail>
    <Detail>
        <empty1>75500012</empty1>
        <empty2>000011</empty2>
        <Reason_Code>AA</Reason_Code>
    </Detail>
    <Detail>
        <empty1>4453252243</empty1>
        <empty2>0004235</empty2>
        <Auth1>AAA</Auth1>
        <Reason_Code>AA</Reason_Code>
    </Detail>
    <Detail>
        <empty1>75500016</empty1>
        <empty2>00002N</empty2>
        <Reason_Code>B3</Reason_Code>
    </Detail>
    <Detail>
        <empty1>75500018</empty1>
        <empty2>000014</empty2>
        <Reason_Code>AA</Reason_Code>
    </Detail>
    <Detail>
        <empty1>43524433</empty1>
        <empty2>000415</empty2>
        <Auth1>BBB</Auth1>
        <Reason_Code>AA</Reason_Code>
    </Detail>
</ns0:File>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="http://yourcompany.com/textschema/mapping/item.xsd">
    <xsl:output method="xml" indent="yes" omit-xml-declaration = "yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="/">
        <Items_All>
            <xsl:for-each select="ns0:File/Detail">
                <Item>
                    
                    
                    <Item_ID>
                        <xsl:value-of select="empty1"/>
                    </Item_ID>
                    
                    <File_ID>
                        <xsl:value-of select="empty2"/>
                    </File_ID>
                    
                    <Auth>
                        <xsl:value-of select="Auth1"/>
                    </Auth>
                    
                    <Reason_Code>
                        <xsl:value-of select="Reason_Code"/>
                    </Reason_Code>
                    
                </Item>
                
            </xsl:for-each>
        </Items_All>
    </xsl:template>
</xsl:stylesheet>

生成的输出:

<Items_All xmlns:ns0="http://yourcompany.com/textschema/mapping/item.xsd">
   <Item>
      <Item_ID>75500013</Item_ID>
      <File_ID>00001N</File_ID>
      <Auth/>
      <Reason_Code>B6</Reason_Code>
   </Item>
   <Item>
      <Item_ID>75500012</Item_ID>
      <File_ID>000011</File_ID>
      <Auth/>
      <Reason_Code>AA</Reason_Code>
   </Item>
   <Item>
      <Item_ID>4453252243</Item_ID>
      <File_ID>0004235</File_ID>
      <Auth>AAA</Auth>
      <Reason_Code>AA</Reason_Code>
   </Item>
   <Item>
      <Item_ID>75500016</Item_ID>
      <File_ID>00002N</File_ID>
      <Auth/>
      <Reason_Code>B3</Reason_Code>
   </Item>
   <Item>
      <Item_ID>75500018</Item_ID>
      <File_ID>000014</File_ID>
      <Auth/>
      <Reason_Code>AA</Reason_Code>
   </Item>
   <Item>
      <Item_ID>43524433</Item_ID>
      <File_ID>000415</File_ID>
      <Auth>BBB</Auth>
      <Reason_Code>AA</Reason_Code>
   </Item>
</Items_All>

期望输出:

<Items_All xmlns:ns0="http://yourcompany.com/textschema/mapping/item.xsd">
    <Item>
        <Item_ID>75500013</Item_ID>
        <File_ID>00001N</File_ID>
        <Auth/>
        <Reason_Code>B6</Reason_Code>
    </Item>
    <Item>
        <Item_ID>75500012</Item_ID>
        <File_ID>000011</File_ID>
        <Auth>AAA</Auth>
        <Reason_Code>AA</Reason_Code>
    </Item>
    <Item>
        <Item_ID>75500016</Item_ID>
        <File_ID>00002N</File_ID>
        <Auth/>
        <Reason_Code>B3</Reason_Code>
    </Item>
    <Item>
        <Item_ID>75500018</Item_ID>
        <File_ID>000014</File_ID>
        <Auth>BBB</Auth>
        <Reason_Code>AA</Reason_Code>
    </Item>
</Items_All>

目前,当我通过XSLT转换XML时,它为所有节点生成,但我希望根据以下条件输出

对于任何节点,当Reason\u code=AA时,检查Auth1的值,并将其带到前一个节点,并捕获同一节点中其他标记的值。请告知

共有1个答案

宣俊豪
2023-03-14

尝试以下操作以获得所需的结果:

如果要将匹配的Auth1值复制到上一个节点,并抑制匹配的细节元素

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://yourcompany.com/textschema/mapping/item.xsd">
    <xsl:output method="xml" indent="yes" omit-xml-declaration = "yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="/">
        <Items_All>
            <xsl:apply-templates/>
        </Items_All>
    </xsl:template>
    
    <xsl:template match="Detail">
        <Items>
            <Item_ID>
                <xsl:value-of select="empty1"/>
            </Item_ID>
                    
            <File_ID>
                <xsl:value-of select="empty2"/>
            </File_ID>
            
            <Auth>
                <xsl:value-of select="following-sibling::*[1][name()]/Auth1"/>
            </Auth>
            
            <Reason_Code>
                <xsl:value-of select="Reason_Code"/>
            </Reason_Code>
        </Items>
    </xsl:template>
    
    <xsl:template match="Detail[Reason_Code='AA' and Auth1]"/>
    
</xsl:stylesheet>
 类似资料:

相关问答

相关文章

相关阅读