1

我们有一个格式如下所示的 XML 文件。

<toploop id="iamroot">
    <firstinner>
        <inner1 Sequence="001">
          <Number>321</Number>
        </inner1>
        <inner1 Sequence="002">
          <Number>345</Number>
        </inner1>
    </firstinner>
    <secondinner>
        <inner2 Sequence="001">
          <Number>321</Number>
          <secondNumber>189</secondNumber>
        </inner2>
        <inner2 Sequence="002">
          <Number>345</Number>
          <secondNumber>998</secondNumber>
        </inner2>
    </secondinner>
</toploop>

我已经尝试了很多东西,但是对于 XSLT/XPath 来说是新手,我无法获得一个查询来表示如下所示的数据。

iamroot,001,321,189
iamroot,002,345,998

如您所见,我想检查 firstinner 标签的 inner1 序列,number 是否与 secondinner 标签的 inner2 序列匹配,然后将 secondinner 标签的 inner2 的 secondNumber 标记值拉到这些旁边。就像 SQL 中的两个表内连接一样。我们可以在 XSLT 中做到这一点吗?我正在尝试值匹配,但我不知道如何匹配同一个 XML 文件中的数据。请帮忙。提前致谢。我也在使用 Xalan-C。

更新:感谢 Kay 和 LarsH。我尝试了以下脚本。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output  method="text" />
<xsl:template match="inner2" />   
<xsl:template match="inner1">
<xsl:variable name="inner2" select="../../secondinner/inner2[Number = current()/Number and @Sequence = current()/@Sequence]"/>   
<xsl:if test="$inner2">     
<xsl:value-of select="concat(/toploop/@id, ',', /toploop/firstinner/inner1/@Sequence, ',', /toploop/firstinner/inner1/Number, ',', $inner2/secondNumber, ',')" />
</xsl:if> 
</xsl:template> 
</xsl:stylesheet>

它给出如下输出。

    iamroot,001,321,189,
    iamroot,002,345,998,

如何使这种格式如下所示,在记录之前没有前导空格以及数据行上方和下方的不必要行。

iamroot,001,321,189,

iamroot,002,345,998,

再次感谢。

4

2 回答 2

4

像这样的东西:

<xsl:template match="inner1">
  <xsl:variable name="inner2" 
   select="../../secondinner/inner2[Number = current()/Number 
                                    and @Sequence = current()/@Sequence"/>
  <xsl:if test="$inner2">
    <xsl:value-of select="concat(../../@id, ',', @Sequence, ',', 
                          Number, ',', $inner2/secondNumber"/>
  </xsl:if>
</xsl:template>

在这里,你正在做两件事之间的连接,.绑定到其中一个和current()另一个。

对于允许在三个或更多节点集之间连接的更通用的解决方案,您可以绑定显式变量,例如<xsl:variable name="one" select="."/>.

于 2011-07-19T08:31:35.927 回答
1

除了修复错字@inner2应该在哪里$inner2...

您还需要添加一个模板来“吞下”您不想处理的元素。现在,默认模板正在将除 inner1 之外的所有元素的字符串内容复制到输出。因此,您需要覆盖该默认模板,至少对于 inner2 元素:

<xsl:template match="inner2" />

这个模板为空的事实意味着<inner2>元素将被消耗而不输出任何东西,也不处理它​​们的后代。

于 2011-07-19T16:20:16.780 回答