以下是我在该表下的xml,基于CTD_CTD_PKG_ID(在CTD_CTD-PKG_ID表下有一段时间ID相同,意味着我们需要从两个表中获取数据)这个包ID我们需要在xsl样式表的帮助下生成一个文本文件,但如何在xslt 中编写逻辑代码
对于某些字段,该类型记录的数据是相同的。我不想只重复一次,但如何控制我是否得到两个CTD_LANG_ID的记录,这些记录需要显示一次,但是我已经写了xslt。我认为这是不正确的,当我们有一个xml,其中又有一个表具有不同的包ID(CTD_CTD_PKG_ID)时,LANG ID可能不同于E但是这个xslt显示了它自己。。。
<?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: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:',./TRAN_TYPE_CODE)"/>,<xsl:text/>
<xsl:if test ="./RECORD_TYPE_CODE" >
<xsl:if test=" position() > 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() > 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() > 1"></xsl:if>
<xsl:text/><xsl:value-of select= "concat(':22:',./CTD_SEQ_NUM)"/>,<xsl:text/>
</xsl:if>
</xsl:template>
预期输出
:25:E,:20:CTD,:21:O102N,:22:089938,:20:ITD,:21:O103N,:22-089939,
下面是一个示例样式表:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text"/>
<xsl:param name="packageId" select="345"/>
<xsl:template match="/">
<xsl:apply-templates select="NewDataSet/Table[CTD_CTD_PKG_ID = $packageId]"/>
</xsl:template>
<xsl:template match="Table">
<xsl:if test="position() > 1">,</xsl:if>
<xsl:apply-templates select="RECORD_TYPE_CODE | MSG_TYPE_CODE | CTD_SEQ_NUM"/>
</xsl:template>
<xsl:template match="Table/*">
<xsl:if test="position() > 1">,</xsl:if>
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
要继续使用您的代码。。。
您正在从错误的上下文开始执行xsl:if
测试。模板上下文为Table
。此外,xsl:text
的使用方式错误。例如,您应该使用更改测试
<xsl:if test="RECORD_TYPE_CODE">
<xsl:value-of select= "RECORD_TYPE_CODE"/><xsl:text>,</xsl:text>
</xsl:if>
如果您希望在输出中省略空值,如,,
。此外,您需要更改最终条件以避免最后一个逗号:
<xsl:if test="CTD_SEQ_NUM">
<xsl:value-of select= "CTD_SEQ_NUM"/>
<xsl:if test="count(following-sibling::Table)>0">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:if>