以下是我的源架构
<ns0:xyz xmlns:ns0="http://abc/xyz">
<main>
<zzz></zzz>
<yyy></yyy>
</main>
<Lines>
<Line>
<LineNum></LineNum>
<Linerate></Linerate>
</Line>
</Lines>
以下是我的输入文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xyz xmlns="http://abc/xyz">
<main>
<zzz>12</zzz>
<yyy>11</yyy>
</main>
<Lines>
<Line>
<LineNum>1</LineNum>
<Linerate>0.5</Linerate>
</Line>
<LineNum>3</LineNum>
<Linerate>0.2</Linerate>
</Line>
<Line>
<LineNum>5</LineNum>
<Linerate>0.5</Linerate>
</Line>
</Lines>
我需要比较行记录并检查Linerate元素是否具有相似的值,然后无论源文件中的记录数量如何,我的目标文件应该只有1条具有该特定行速率值的记录。
对于每个不同的Linerate值,应该有相应的记录。
应将Linerate值指定给目标
中的百分比节点LineNum值的累积和值应分配给目的地的金额(如果源中的记录的线速度值相同)
Linerate * LineNum的累积总和应该被归结为目的地中的AdditionalAmount
以下是预期的输出文件
<LineSummary>
<Percent>0.5</Percent>
<Amount>6</Amount>
<AdditionalAmount>3</AdditionalAmount>
</LineSummary>
<LineSummary>
<Percent>0.2</Percent>
<Amount>3</Amount>
<AdditionalAmount>0.6</AdditionalAmount>
</LineSummary>
下面是我的BizTalk Map中使用的XSLT代码。
<xsl:variable name="unique-LineRate" select="//Lines/Line[not(Linerate=preceding-sibling::Line/Linerate)]/Linerate" />
<xsl:for-each select="$unique-LineRate">
<LineSummary>
<xsl:variable name="LineSum" select="sum(//Lines/Line[Linerate=current()]/LineNum)" />
<Percent><xsl:value-of select="current()"/></Percent>
<Amount><xsl:value-of select="$LineSum" /></Amount>
<AdditionalAmount><xsl:value-of select="current() * $LineSum"/></AdditionalAmount>
</LineSummary>
</xsl:for-each>
如果我的源模式“ElementFormDefault”值保持为不合格或默认值,则会收到以下错误:输入验证错误:名称空间“http://abc/xyz”中的元素“xyz”具有无效的子元素“main”在命名空间“http://abc/xyz”中。预期可能元素列表:'main'。
如果我的源模式“ElementFormDefault”保持为Qualified,则XSLT不起作用。我确信它必须对命名空间问题或元素标记做一些事情但我不确定我需要做出哪些改变。
我是否需要在XPSL或命名空间前加上XSLT中的所有元素?