我有一个 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>
我想你想做这样的事情:
<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> </xsl:text>
</xsl:template>
</xsl:stylesheet>
我必须修改您的
HeaderLevel
模板以及输出方法才能获得合理的结果,使用提供的输入示例将是:
1 - 12345 - 12345
2 - 0000 - 0000
3 - 123 - 7777
4 - 14 - 123