如何控制多个标签不必再重复一次

时间:2011-06-22 11:22:47

标签: xslt xslt-1.0

这里我在我的xslt中使用CTD_CTD_PKG_ID表来定位数据,但是有些标签的数据与我们必须控制的不再重复的标签类型非常相似

<?xml version="1.0" standalone="yes"?>
 <NewDataSet>
 <Table>
 <RECORD_TYPE_CODE>CTD</RECORD_TYPE_CODE>
 <MSG_TYPE_CODE>O102</MSG_TYPE_CODE>
 <CTD_SEQ_NUM>089938</CTD_SEQ_NUM>    
 <CTD_CTD_PKG_ID>345</CTD_CTD_PKG_ID>
 <CTD_LANG_ID>E</CTD_LANG_ID>
 </Table>
 <Table>
 <RECORD_TYPE_CODE>ITD</RECORD_TYPE_CODE>
 <MSG_TYPE_CODE>O103</MSG_TYPE_CODE>
 <CTD_SEQ_NUM>089939</CTD_SEQ_NUM>    
 <CTD_CTD_PKG_ID>345</CTD_CTD_PKG_ID>
 <CTD_LANG_ID>E</CTD_LANG_ID>
 </Table>   
 </NewDataSet>

我在下面写了我的xslt

<?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" indent="no" omit-xml-declaration="yes" />

<xsl:param name="PackageId"  />
<xsl:template match="/">

<xsl:apply-templates select="NewDataSet/Table[CTD_CTD_PKG_ID ='345']"/>     
</xsl:template>


<xsl:template match="NewDataSet/Table[CTD_CTD_PKG_ID ='345']">

<xsl:value-of select= "concat(':25:',./CTD_LANG_ID)"/>,<xsl:text/>
    <xsl:if test ="./RECORD_TYPE_CODE"  >
        <xsl:if test=" position() &gt; 1"></xsl:if>
        <xsl:text/><xsl:value-of select= "concat(':20:',./RECORD_TYPE_CODE)" />,<xsl:text/>
    </xsl:if>
    <xsl:if test ="./MSG_TYPE_CODE" >
        <xsl:if test=" position() &gt; 1"></xsl:if>
        <xsl:text/><xsl:value-of select= "concat(':21:',./MSG_TYPE_CODE)"/>,<xsl:text/>
    </xsl:if>
    <xsl:if test ="./CTD_SEQ_NUM" >
        <xsl:if test=" position() &gt; 1"></xsl:if>
        <xsl:text/><xsl:value-of select= "concat(':22:',./CTD_SEQ_NUM)"/>,<xsl:text/>
    </xsl:if>       

</xsl:template> 
</xsl:stylesheet>

此上面的当前输出xslt

:25:E,:25:E,

预期产出= 的:25:E,

1 个答案:

答案 0 :(得分:0)

如果您使用此类特定ID,一种简单的方法是使用position()函数简单地选择具有匹配ID的第一个TABLE,就像这样

<xsl:apply-templates select="NewDataSet/Table[CTD_CTD_PKG_ID ='345'][position()=1]"/>

请注意,如果需要,您只需在Table上匹配即可简化模板匹配。在这种情况下,这是整个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text" indent="no" omit-xml-declaration="yes"/>
   <xsl:param name="PackageId"/>
   <xsl:template match="/">
      <xsl:apply-templates select="NewDataSet/Table[CTD_CTD_PKG_ID ='345'][position()=1]"/>
   </xsl:template>
   <xsl:template match="Table">
      <xsl:value-of select="concat(':25:',./CTD_LANG_ID)"/>,
      <xsl:text/></xsl:template>
</xsl:stylesheet>

应用于输入XML时,结果如下:

:25:E,