XSL 1.0-скрытие дочерних узлов, когда дочерний элемент равен Null

Я пытался сделать так, чтобы дочерние элементы моей структуры скрывались, основываясь на том, что они пусты.
Из чтения других сообщений я нашел этот удалить родительский узел, если дочерний узел пуст, но я не понимаю его достаточно, чтобы реализовать его в моем XSL. У меня была попытка применить связанный пост к моему XSL, но он не вносит желаемых изменений в мои выходные данные.

Так что мой XML похож на это:

<?xml version="1.0" encoding="UTF-8" ?>
<exchange>
<sce>
<sce.srs>
<sce_scjc.sce.srs>140008305/1</sce_scjc.sce.srs>
<sce_seq2.sce.srs>01</sce_seq2.sce.srs>
<sce_stuc.sce.srs>140008305</sce_stuc.sce.srs>
<spr>
<spr.cams>
<spr_code.spr.cams>140008305/1</spr_code.spr.cams>
<prs_code.spr.cams>77711925</prs_code.spr.cams>
<prs>
<prs.mensys>
<prs_code.prs.mensys>77711925</prs_code.prs.mensys>
<prs_name.prs.mensys>Johan</prs_name.prs.mensys>
</prs.mensys>
</prs>
</spr.cams>
</spr>
</sce.srs>
<sce.srs>
<sce_scjc.sce.srs>151516736/1</sce_scjc.sce.srs>
<sce_seq2.sce.srs>01</sce_seq2.sce.srs>
<sce_stuc.sce.srs>151516736</sce_stuc.sce.srs>
<spr>
<spr.cams>
<spr_code.spr.cams>151516736/1</spr_code.spr.cams>
<prs_code.spr.cams>77709062</prs_code.spr.cams>
<prs>
<prs.mensys>
<prs_code.prs.mensys>77709062</prs_code.prs.mensys>
<prs_name.prs.mensys>Evangelia</prs_name.prs.mensys>
</prs.mensys>
</prs>
</spr.cams>
</spr>
</sce.srs>
<sce.srs>
<sce_scjc.sce.srs>150052468/1</sce_scjc.sce.srs>
<sce_seq2.sce.srs>01</sce_seq2.sce.srs>
<sce_stuc.sce.srs>150052468</sce_stuc.sce.srs>
<spr>
<spr.cams>
<spr_code.spr.cams>150052468/1</spr_code.spr.cams>
<prs_code.spr.cams/>
</spr.cams>
</spr>
</sce.srs>
</sce>
</exchange>

И мой XSL выглядит как passaage ниже. У меня есть шаблон элемента nil, который я добавил, Поскольку я думал, что искать значение было проще, чем искать nulll, так что рады, что он выйдет, если не нужно.

<?xml version="1.0"?>
<xsl:stylesheet   exclude-result-prefixes="xd" version="1.0" >
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/exchange/sce">
<ImportTask>
<EntityRelationshipEntities>
 <xsl:apply-templates select="node()|@*"/>
</EntityRelationshipEntities>
</ImportTask>
</xsl:template>

<xsl:template name="nilElement">
<xsl:param name="value"/>
<xsl:choose>
<xsl:when test="string($value)">
<xsl:value-of select="$value"/>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="xsi:nil" namespace="http://www.w3.org/2001/XMLSchema-instance">True</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

<xsl:template match="sce.srs[not(*/AttributeValue[not(@AttributeValue='True')])]">
<xsl:for-each select="spr/spr.cams">
<EntityRelationshipEntity>
<ErRef>ERREF_21</ErRef>
<EntityCode><xsl:value-of select="../../sce_stuc.sce.srs"/></EntityCode>
<AttributeValue>
<xsl:call-template name="nilElement">
<xsl:with-param name="value" select="prs/prs.mensys/prs_name.prs.mensys"/>
</xsl:call-template>
</AttributeValue>
<Action>VALUEONLY</Action>
</EntityRelationshipEntity>
</xsl:for-each>
</xsl:template>    

<xsl:template match="AttributeValue[@AttributeValue = 'True']"/>
</xsl:stylesheet>

Так что это в настоящее время дает мне:

<ImportTask >
<EntityRelationshipEntities>
<EntityRelationshipEntity>
<ErRef>ERREF_21</ErRef>
<EntityCode>151514490</EntityCode>
<AttributeValue xsi_nil="True"/>
<Action>VALUEONLY</Action>
</EntityRelationshipEntity>
<EntityRelationshipEntity>
<ErRef>ERREF_21</ErRef>
<EntityCode>140008305</EntityCode>
<AttributeValue>Johan</AttributeValue>
<Action>VALUEONLY</Action>
</EntityRelationshipEntity>
<EntityRelationshipEntity>
<EntityCode>151516736</EntityCode>
<AttributeValue>Evangelia</AttributeValue>
<Action>VALUEONLY</Action>
</EntityRelationshipEntity>
</EntityRelationshipEntities>
</ImportTask>

То, что я хотел бы произвести, — это те, где нет null. Это будет означать, что дочерний элемент ниже не выводится:

<EntityRelationshipEntity>
<ErRef>ERREF_21</ErRef>
<EntityCode>151514490</EntityCode>
<AttributeValue xsi_nil="True"/>
<Action>VALUEONLY</Action>
</EntityRelationshipEntity>

Но другие будут выводить что-то вроде этого:

<ImportTask >
<EntityRelationshipEntities>
<EntityRelationshipEntity>
<ErRef>ERREF_21</ErRef>
<EntityCode>140008305</EntityCode>
<AttributeValue>Johan</AttributeValue>
<Action>VALUEONLY</Action>
</EntityRelationshipEntity>
<EntityRelationshipEntity>
<EntityCode>151516736</EntityCode>
<AttributeValue>Evangelia</AttributeValue>
<Action>VALUEONLY</Action>
</EntityRelationshipEntity>
</EntityRelationshipEntities>
</ImportTask>

Кто-нибудь может помочь мне правильно применить это?

Большое спасибо

Иона

1 ответ

  1. Возможно, я что-то упускаю, но не может ли это быть просто:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    >
    <xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="/exchange/sce">
        <ImportTask >
            <EntityRelationshipEntities>
                <xsl:apply-templates select="sce.srs/spr/spr.cams[string(prs/prs.mensys/prs_name.prs.mensys)]"/>
            </EntityRelationshipEntities>
        </ImportTask>
    </xsl:template>
    
    <xsl:template match="spr.cams">
        <EntityRelationshipEntity>
            <ErRef>ERREF_21</ErRef>
            <EntityCode>
                <xsl:value-of select="../../sce_stuc.sce.srs"/>
            </EntityCode>
            <AttributeValue>
                <xsl:value-of select="prs/prs.mensys/prs_name.prs.mensys"/>
            </AttributeValue>
            <Action>VALUEONLY</Action>
        </EntityRelationshipEntity>
    </xsl:template>    
    
    </xsl:stylesheet>