XSL测试子元素

时间:2017-10-24 13:14:52

标签: xml xslt

这是我的XML

<SESSION MAPPINGNAME ="example_mapping_name" DESCRIPTION ="here is some data">
  <SESSTRANSFORMATIONINST TRANSFORMATIONNAME ="name1" TRANSFORMATIONTYPE ="Target Definition">
  </SESSTRANSFORMATIONINST>
  <SESSTRANSFORMATIONINST TRANSFORMATIONNAME ="name2" TRANSFORMATIONTYPE ="Source Definition">
  </SESSTRANSFORMATIONINST>
  <SESSTRANSFORMATIONINST TRANSFORMATIONNAME ="name3" TRANSFORMATIONTYPE ="Lookup Procedure">
  </SESSTRANSFORMATIONINST>

这是我的XSL

<xsl:template match="SESSION">      
    <xsl:value-of select="SESSTRANSFORMATIONINST[count(@TRANSFORMATIONTYPE !='Lookup Procedure')]" />
        <tr>
            <td class="mapping"><xsl:value-of select="@MAPPINGNAME" /> (<xsl:value-of select="@DESCRIPTION" />)</td>
            <td class="source-definition"><xsl:apply-templates select="SESSTRANSFORMATIONINST[@TRANSFORMATIONTYPE = 'Source Definition']"/></td>
            <td class="source-tables"><xsl:apply-templates select="SESSTRANSFORMATIONINST[@TRANSFORMATIONTYPE = 'Source Qualifier']/ATTRIBUTE[@NAME = 'Sql Query']" />  </td>
            <td><xsl:apply-templates select="SESSIONEXTENSION[@TRANSFORMATIONTYPE = 'Target Definition']" /></td>
            <td><xsl:value-of select="ATTRIBUTE[@NAME = 'Parameter Filename']/@VALUE" /></td>           
        </tr>       
</xsl:template>

我已经从XML中留下了一些细节,但希望你能够了解它的外观。我试图从会话中提取映射名称(以及来自SESSTRANSFORMATIONINST的其他属性),但仅限于SESSION不包含查找过程的SESSTRANSFORMATIONINST TRANSFORMATIONTYPE的情况。

我认为使用一种方法可能是一个很好的方法。这将计算查找过程在TRANSFORMATIONTYPE中出现的次数,如果大于0,则不会提取数据。

我对XSL很新,所以不确定如何编码。任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:0)

这里的一个问题是您似乎试图同时做两件事:获取会话名称和会话中的值。这些应该是两种不同的操作。

根据您提供给我们的内容,很难准确地告诉您需要做什么,但这可能是基于以下几点:

<!-- in a template somewhere -->
<xsl:apply-templates select="POWERMART/REPOSITORY/FOLDER/WORKFLOW/SESSION" />

<xsl:template match="SESSION">
  <outputSession id="{ @NAME }">
    <xsl:apply-templates select="SESSTRANSFORMATIONINST[@TRANSFORMATIONTYPE != 'oranges']" />
  </outputSession>
</xsl:template>

<xsl:template match="SESSTRANSFORMATIONINST">
  <outputInst>
    <xsl:copy-of select="@*" />
  </outputInst>
</xsl:template>

答案 1 :(得分:0)

如果您打算使用<SESSION>决定是否显示<xsl:if test="count(SESSTRANSFORMATIONINST[@TRANSFORMATIONTYPE = 'Lookup Procedure']) = 0"> 的属性值,则需要修改条件,如下所示。

@TRANSFORMATIONTYPE = Lookup Procedure

这将检查0节点的<SESSIONTRANSFORMATIONINST>计数是否为0。如果计数为<xsl:if>,则会处理<xsl:template match="SESSION"> <xsl:if test="count(SESSTRANSFORMATIONINST[@TRANSFORMATIONTYPE = 'Lookup Procedure']) = 0"> <tr> ... </tr> </xsl:if> </xsl:template> 中的代码。

模板可以修改如下。

this.allStatisticsRef = afDatabase.list(`data/users/${this.currentUserID}/statistics`);
  this.allStatisticData = this.allStatisticsRef.snapshotChanges().map(changes => {
    return changes.map(c => ({ key: c.payload.key, ...c.payload.val() }));
});