如何过滤源 XML,然后将结果再次作为 XML 传递以正常处理

问题描述 投票:0回答:1

我有一个 xslt 和 xml 处理工作流程,其中文档从根匹配开始处理,然后触发各种其他处理元素。我现在需要采用相同的工作流程并注入一个预处理步骤,该步骤将在子级别之一过滤数据,然后像以前一样继续处理。

当前 输入 A (xmlA) -> 模板 (xslt1) = 输出

预处理 输入 A (xmlA) -> 过滤掉不需要的数据 (xmlNEW) -> 模板 (xslt1) = 输出(没有过滤数据)

我需要在处理文档之前注入它,因为已经存在太多模板,如果我在处理工作流程中进一步过滤数据,这些模板就会中断。

我让过滤器在单独的测试文档中工作,当尝试在模板调用中使用变量和参数时,我只是无法让它工作。

示例 XML:

<?xml version="1.0" encoding="UTF-16"?>
<MultiDocumentLevel>
    <DocumentLevel>
        <OrderLevel>
            <AllowedFormat>
                <HeaderLevel>
                    <HeaderSort>12345</HeaderSort>
                    <HeaderCode>12345</HeaderCode>
                </HeaderLevel>
                <HeaderLevel>
                    <HeaderSort>9999</HeaderSort>
                    <HeaderCode>9999-1</HeaderCode>
                </HeaderLevel>
                <HeaderLevel>
                    <HeaderSort>0000</HeaderSort>
                    <HeaderCode>0000</HeaderCode>
                </HeaderLevel>
                <HeaderLevel>
                    <HeaderSort>8989</HeaderSort>
                    <HeaderCode>8989</HeaderCode>
                </HeaderLevel>
                <HeaderLevel>
                    <HeaderSort>7777</HeaderSort>
                    <HeaderCode>123</HeaderCode>
                </HeaderLevel>
                <HeaderLevel>
                    <HeaderSort>123</HeaderSort>
                    <HeaderCode>14</HeaderCode>
                </HeaderLevel>
                <HeaderLevel>
                    <HeaderSort>1</HeaderSort>
                    <HeaderCode>1</HeaderCode>
                </HeaderLevel>
            </AllowedFormat>
        </OrderLevel>
    </DocumentLevel>
</MultiDocumentLevel>

主模板:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="html"/>

    <xsl:template match="/">
        <xsl:apply-templates select="MultiDocumentLevel"/>
    </xsl:template>

    <!--    ****************************************************************************************************************** -->
    <!--        Name:           MultiDocumentLevel                                                                                           -->
    <!--                        Xsl's Main Template - Start of Builder                                                                                           -->
    <!--    ****************************************************************************************************************** -->
    
    <xsl:template match="MultiDocumentLevel">
        <xsl:apply-templates select="DocumentLevel/OrderLevel/AllowedFormat/HeaderLevel"/>
    </xsl:template> 

    <!--    ****************************************************************************************************************** -->
    <!--        Name:           HeaderLevel                                                                                    -->
    <!--                        Xsl's HeaderLevel Template - Process main data                                                 -->
    <!--    ****************************************************************************************************************** -->

    <xsl:template match="HeaderLevel">
        <!-- Process all nodes under HeaderLevel-->  
        <xsl:value-of select="concat(position(),'  -  ',HeaderCode,'  -  ',.)"/><br/>
    </xsl:template> 
    
</xsl:stylesheet>

过滤器模板

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="xml" indent="yes"/>

<xsl:variable name="allowedheaders">
    <headers status="AllowedToPrint">
        <HeaderSort printHeader="12345" name="Allowed1"/>
        <HeaderSort printHeader="123" name="Allowed2"/>
        <HeaderSort printHeader="0000" name="Allowed3"/>
    </headers>
</xsl:variable>

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

    <xsl:template match="HeaderLevel">  
                  <!-- filter the data at headerlevel based on lookup in allowedheaders variable -->
                    <xsl:if test="HeaderSort=msxsl:node-set($allowedheaders)/headers[@status='AllowedToPrint']/HeaderSort/@printHeader 
                    or HeaderCode=msxsl:node-set($allowedheaders)/headers[@status='AllowedToPrint']/HeaderSort/@printHeader">
                    <xsl:copy>
                        <xsl:apply-templates select="@*|node()"/>
                    </xsl:copy>
                </xsl:if>
    </xsl:template> 

</xsl:stylesheet>
xml xslt xpath-1.0
1个回答
0
投票

我想你想做这样的事情:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="text"/>

<xsl:variable name="allowedheaders">
    <headers status="AllowedToPrint">
        <HeaderSort printHeader="12345" name="Allowed1"/>
        <HeaderSort printHeader="123" name="Allowed2"/>
        <HeaderSort printHeader="0000" name="Allowed3"/>
    </headers>
</xsl:variable>

<xsl:template match="/MultiDocumentLevel">
    <!-- filter the data at headerlevel based on lookup in allowedheaders variable -->
    <xsl:variable name="filtered">
        <xsl:copy-of select="DocumentLevel/OrderLevel/AllowedFormat/HeaderLevel[HeaderSort=msxsl:node-set($allowedheaders)/headers[@status='AllowedToPrint']/HeaderSort/@printHeader or HeaderCode=msxsl:node-set($allowedheaders)/headers[@status='AllowedToPrint']/HeaderSort/@printHeader]"/>
    </xsl:variable>
    <!-- process the filtered data -->
    <xsl:apply-templates select="msxsl:node-set($filtered)/HeaderLevel"/>
</xsl:template>


<!--    ****************************************************************************************************************** -->
<!--        Name:           HeaderLevel                                                                                    -->
<!--                        Xsl's HeaderLevel Template - Process main data                                                 -->
<!--    ****************************************************************************************************************** -->

<xsl:template match="HeaderLevel">
     <!-- Process all nodes under HeaderLevel-->  
    <xsl:value-of select="concat(position(), '  -  ', HeaderCode,'  -  ', HeaderSort)"/>
    <xsl:text>&#10;</xsl:text>
</xsl:template> 

</xsl:stylesheet>

我必须修改您的

HeaderLevel
模板以及输出方法才能获得合理的结果,使用提供的输入示例将是:

1  -  12345  -  12345
2  -  0000  -  0000
3  -  123  -  7777
4  -  14  -  123
© www.soinside.com 2019 - 2024. All rights reserved.