0

光环,

我有这个 xml 文档:

<document>
<Line>
    <Line-Item>
        <ID>5</ID>
        <Quantity>100</Quantity>                
    </Line-Item>
</Line>
<Line>
    <Line-Item>
        <ID>6</ID>
        <Quantity>9</Quantity>              
    </Line-Item>
</Line>
<Line>
    <Line-Item>
        <ID>60</ID>
        <Quantity>3020</Quantity>               
    </Line-Item>
</Line>
</document>

并使用表格查找文件:

<lookup>
    <Code>
        <LookupID>5</LookupID>
        <LookupQuantity>25</LookupQuantity>
    </Code>
    <Code>
        <LookupID>6</LookupID>
        <LookupQuantity>3</LookupQuantity>
    </Code>
    <Code>
        <LookupID>70</LookupID>
        <LookupQuantity>3</LookupQuantity>
    </Code>
</lookup>

我应该使用文档 Line/Line-Item/ID 检查查找表字段 lookup/Code/LookupId。如果lookup/Code/LookupId=document/Line/Line-Item/ID然后document/Line/Line-Item/Quantity=document/Line/Line-Item/Quantity div lookup/Code/LookupQuantity,否则document/Line/Line-项目/数量=文档/行/行项目/数量

需要的结果:

<document>
<Line>
    <Line-Item>
        <ID>5</ID>
        <Quantity>4</Quantity>              
    </Line-Item>
</Line>
<Line>
    <Line-Item>
        <ID>6</ID>
        <Quantity>3</Quantity>              
    </Line-Item>
</Line>
<Line>
    <Line-Item>
        <ID>60</ID>
        <Quantity>3020</Quantity>               
    </Line-Item>
</Line>
</document>

我的 xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times" extension-element-prefixes="date">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

    <xsl:key name="skRez" match="LookupQuantity" use="../LookupID"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Line/Line-Item/Quantity">
        <xsl:variable name="inputS" select="..//ID"/>
        <xsl:variable name="inputQ" select="..//Quantity"/>
            <OrderedQuantity>
                <xsl:for-each select="document('lookup.xml')">
                    <xsl:for-each select="key('skRez',$inputS)">
                        <xsl:variable name="Quantity" select="."/>
                        <xsl:choose>
                            <xsl:when test="$Quantity"><xsl:value-of select="ceiling($inputQ div $Quantity)"/></xsl:when>
                            <xsl:otherwise><xsl:value-of select="$inputQ"/></xsl:otherwise>
                        </xsl:choose>                       
                    </xsl:for-each>
                </xsl:for-each>
            </OrderedQuantity>
    </xsl:template>
</xsl:stylesheet>
4

1 回答 1

1

为此,您可以定义一个变量来保存查找数据

<xsl:variable name="lookup" select="document('Lookup.xml')/lookup"/>

然后您可以像这样查找特定 Line-Item 的数量(在这种情况下,XSLT 当前位于 Line-Item 内的 Quantity 元素上)

<xsl:variable name="quantity" 
  select="$lookup//Code[LookupID = current()/../ID]/LookupQuantity"/>

如果此变量未返回任何内容,则您知道该元素不在查找中

这是完整的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:variable name="lookup" select="document('Lookup.xml')/lookup"/>

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

   <xsl:template match="Line-Item/Quantity">
      <xsl:variable name="quantity" 
         select="$lookup//Code[LookupID = current()/../ID]/LookupQuantity"/>
      <Quantity>
         <xsl:choose>
            <xsl:when test="number($quantity) = number($quantity)">
               <xsl:value-of select="number(.) div number($quantity)"/>
            </xsl:when>
            <xsl:otherwise>
               <xsl:value-of select="."/>
            </xsl:otherwise>
         </xsl:choose>
      </Quantity>
   </xsl:template>
</xsl:stylesheet>

应用于您的示例 XML 时,将输出以下内容

<document>
   <Line>
      <Line-Item>
         <ID>5</ID>
         <Quantity>4</Quantity>
      </Line-Item>
   </Line>
   <Line>
      <Line-Item>
         <ID>6</ID>
         <Quantity>3</Quantity>
      </Line-Item>
   </Line>
   <Line>
      <Line-Item>
         <ID>60</ID>
         <Quantity>3020</Quantity>
      </Line-Item>
   </Line>
</document>
于 2012-05-14T08:43:25.447 回答