2016-05-03 2 views
0

Я пытаюсь сделать дочерние элементы моей структуры скрытыми на основе их пустых. От чтения других сообщений я нашел это Remove parent node if a child node is empty, но я этого недостаточно понимаю, чтобы реализовать его в своем XSL. Я попытался применить связанный пост к моему XSL, но он не внесет желаемых изменений в мой вывод.XSL 1.0 - Скрытие дочерних узлов, когда дочерний элемент является Null

Так что мой 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 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" exclude-result-prefixes="xd" version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<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> 

То, что я хотел бы произвести вне тех, где не равна нулю. Это означало бы, что ниже ребенок не выход:

<EntityRelationshipEntity> 
<ErRef>ERREF_21</ErRef> 
<EntityCode>151514490</EntityCode> 
<AttributeValue xsi:nil="True"/> 
<Action>VALUEONLY</Action> 
</EntityRelationshipEntity> 

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

<ImportTask xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<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> 

Может кто-то помочь мне применить это правильно?

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

Ионы

+0

Почему ' ERREF_21' отсутствует в последнем '' как на вашем текущем выходе, так и на ожидаемом? –

+0

@ michael.hor257k, моя ошибка, я попытался сократить оригинальный XML, чтобы быть меньше, легче читать и должен был вырезать линию . Извините, моя ошибка. Я недостаточно уверен в том, чтобы манипулировать оператором select, поэтому начал пробовать другие способы заставить его работать. Могу я задать вопрос? В выборе ниже: select = "sce.srs/spr/spr.cams [string (prs/prs.mensys/prs_name.prs.mensys) Правильно ли я думаю, что функция String используется на prs_name, поскольку она будет только возвращать элементы, где длина строки больше нуля? – jonah

+0

Да, предикат (выражение в квадратных скобках) используется для исключения узлов, где выражение возвращает false, а пустая строка возвращает false. –

ответ

0

Может быть, я что-то не хватает, но не могло быть просто:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <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> 
+0

Спасибо @ michael.hor257k, что работает в совершенстве. – jonah

Смежные вопросы