这是根据CTD_CTD_PKG_ID在该表下面的xml(在表CTD_CTD_PKG_ID id下的某个时间相同意味着我们需要从两个表中获取数据)这个包ID我们需要在xsl样式表的帮助下生成一个文本文件但是如何在xslt中编写逻辑代码
对于某些字段数据是相同的那种类型的记录对我来说不想只重复一次我需要但如何控制如果我得到两个CTD_LANG_ID记录需要显示一次但我写了xslt我在想这是不正确我们将失败当我们有一个具有不同包ID(CTD_CTD_PKG_ID)的xml时,lang id可能与E不同但是这个xslt显示E它自己......
<?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,
答案 0 :(得分:1)
以下是样式表示例:
<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>
答案 1 :(得分:0)
继续使用您的代码...
您正在从错误的上下文开始执行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>