как получить данные на основе идентичных условий были одинаковыми - PullRequest
1 голос
/ 21 июня 2011

вот мой ниже xml под этой таблицей, основанный на CTD_CTD_PKG_ID (некоторое время под таблицей CTD_CTD_PKG_ID id был одним и тем же, означает, что нам нужно взять данные из обеих таблиц) этот идентификатор пакета нам нужно создать текстовый файл с помощью таблицы стилей xsl но как написать логический код в xslt

для некоторых полей данные были одинаковыми для этого типа записей, для меня не хочу повторяться еще раз только один раз, когда мне нужно, но как контролировать, если я получаю две записи CTD_LANG_ID, которые должны отображаться один раз, но я написал xslt, я думал это было не правильно, мы потерпим неудачу, когда у нас будет XML с еще одной таблицей с другим идентификатором пакета (CTD_CTD_PKG_ID), в то время идентификатор lang может отличаться от 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() &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> 


Ожидаемый результат

: 25: Е,: 20: КТР,: 21: O102N,: 22: 089938,: 20: ИТД,: 21: O103N,: 22: 089939,

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Вот пример таблицы стилей:

<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() &gt; 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() &gt; 1">,</xsl:if>
    <xsl:value-of select="."/>
  </xsl:template>

</xsl:stylesheet>
0 голосов
/ 21 июня 2011

Чтобы остаться с вашим кодом ...

Вы выполняете 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>
...