我输入以下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。
答案 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元素输出该行。