具有日志报告的xslt转换,用于孤立转换

时间:2017-05-20 13:20:36

标签: xslt-2.0

我输入以下XML:

<TABLE NAME="pivot.cs">
  <DATA RECORDS="3">
    <RECORD ID="1">
      <INTERNALID>5550</INTERNALID>
      <SOMEID>1</SOMEID>
      <CODAL>ZERO</CODAL>
    </RECORD>
    <RECORD ID="2">
      <INTERNALID>5556</INTERNALID>
      <SOMEID>2</SOMEID>
      <CODAL>SIX</CODAL>
    </RECORD>
    <RECORD ID="3">
      <INTERNALID>5557</INTERNALID>
      <SOMEID>3</SOMEID>
      <CODAL>SEVEN</CODAL>
    </RECORD>
   <RECORD ID="93">
      <INTERNALID>9999</INTERNALID>
      <SOMEID>9</SOMEID>
      <CODAL>NINE</CODAL>
    </RECORD>
  </DATA>
</TABLE>

并将路径传递给另一个XML文件:

B.XML

<TABLE NAME="ALT.CS">
  <DATA RECORDS="5">
    <RECORD ID="15">
      <RECNO>5555</RECNO>
      <TOBEEXTRACTED>ECHO</TOBEEXTRACTED>
    </RECORD>
    <RECORD ID="16">
      <RECNO>5556</RECNO>
      <TOBEEXTRACTED>FOXTROT</TOBEEXTRACTED>
    </RECORD>
    <RECORD ID="17">
      <RECNO>5557</RECNO>
      <TOBEEXTRACTED>GOLF</TOBEEXTRACTED>
    </RECORD>
  </DATA>
</TABLE>

作为参数,我们可以使用:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="lookup-path">path/to/b.xml</xsl:param>
<xsl:key name="lookup" match="RECORD" use="RECNO" />

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

<xsl:template match="CODAL">
    <xsl:variable name="match" select="key('lookup', ../INTERNALID, document($lookup-path))" />
    <xsl:copy>
        <xsl:value-of select="."/>
        <xsl:if test="$match">
            <xsl:text> [</xsl:text>
            <xsl:value-of select="$match/TOBEEXTRACTED"/>
            <xsl:text> </xsl:text>
            <xsl:number value="../SOMEID" format="A" />
            <xsl:text>]</xsl:text>
        </xsl:if>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

返回:

结果

<TABLE NAME="pivot.cs">
  <DATA RECORDS="3">
    <RECORD ID="1">
      <INTERNALID>5550</INTERNALID>
      <SOMEID>1</SOMEID>
      <CODAL>ZERO</CODAL>
    </RECORD>
    <RECORD ID="2">
      <INTERNALID>5556</INTERNALID>
      <SOMEID>2</SOMEID>
      <CODAL>SIX [FOXTROT B]</CODAL>
    </RECORD>
    <RECORD ID="3">
      <INTERNALID>5557</INTERNALID>
      <SOMEID>3</SOMEID>
      <CODAL>SEVEN [GOLF C]</CODAL>
    </RECORD>
      <RECORD ID="93">
      <INTERNALID>9999</INTERNALID>
      <SOMEID>9</SOMEID>
      <CODAL>NINE</CODAL>
    </RECORD>
  </DATA>
</TABLE>

在XSLT 2.0中,我们可以使用xsl:result-document来创建辅助输出文件,并使用匹配孤立节点的模板填充它,如@ michael.hor257k所示,但无法使其工作,因此在这里记录必须报告INTERNALID 9999是ORPHANED。

1 个答案:

答案 0 :(得分:0)

好吧,如果你真的使用XSLT 2.0处理器,那么只需添加一个模板

<xsl:template match="/">
  <xsl:result-document href="report.txt" method="text">
    <xsl:apply-templates select="//RECORD[not(key('lookup', INTERNALID, document($lookup-path)))]" mode="report"/>
  </xsl:result-document>
  <xsl:apply-templates/>
</xsl:template>

确保创建必要的文本文档并处理不匹配的RECORD元素,然后添加模板

<xsl:template match="RECORD" mode="report">
  <xsl:text>INTERNALID </xsl:text>
  <xsl:value-of select="INTERNALID"/>
  <xsl:text> was orphaned.
</xsl:text>
</xsl:template>

在该模式下为每个已处理的RECORD元素输出该行。