Удаление пустого узла, созданного XSL - PullRequest
2 голосов
/ 16 сентября 2011

Я хочу удалить элемент, созданный xsl.Я проверяю детей после создания элемента. Например

<projectRisks>    (element to be removed if it empty after creation)

 <for-each risk>

  <if riskid=projid >

      COPY RISK

  </if >

 </foreach>

<projectRisks>

После завершения этого, если нет дочерних элементов для projectRisks, мне нужно удалить его.Я перепробовал все решения, представленные здесь.Но, как и риски проекта, созданные здесь в xsl, не удалось его удалить.

здесь я предоставляю пример XML

 <addProjectDetail>
<uniqueProjectId>142</uniqueProjectId>
</addProjectDetail>
<addProjectDetail>
<uniqueProjectId>915</uniqueProjectId>
</addProjectDetail>
<addProjectDetail>
<uniqueProjectId>100</uniqueProjectId>
</addProjectDetail>
  <addProjectRisks>
    <addProjectRisk>
        <uniqueProjectId>142</uniqueProjectId>
        <agencyProjectRiskId>852</agencyProjectRiskId>              
    </addProjectRisk>
   <addProjectRisk>
    <uniqueProjectId>915</uniqueProjectId>
    <agencyProjectRiskId>853</agencyProjectRiskId>  
    </addProjectRisk>   
   </addProjectRisks>

Результирующий xml выглядит как

   <addProjectDetail>
   <uniqueProjectId>142</uniqueProjectId>
      </addProjectDetail>
<addProjectRisks>
    <addProjectRisk>
        <uniqueProjectId>142</uniqueProjectId>
        <agencyProjectRiskId>852</agencyProjectRiskId>              
    </addProjectRisk>
</addProjectRisks>
<addProjectDetail>
<uniqueProjectId>915</uniqueProjectId>
</addProjectDetail>
<addProjectRisks>
    <addProjectRisk>
        <uniqueProjectId>915</uniqueProjectId>
         <agencyProjectRiskId>853</agencyProjectRiskId>             
    </addProjectRisk>
</addProjectRisks>
 <addProjectDetail>
<uniqueProjectId>100</uniqueProjectId>
</addProjectDetail>

Ввышеупомянутый xml, есть 3 кода, 142, 915 и 100. В соответствии с 142 и 915 существует 2 риска, а для 100 нет рисков. Поэтому для 100 он не должен создавать элемент addProjectRisks

1 Ответ

0 голосов
/ 16 сентября 2011

Вы можете использовать это преобразование, для которого я использовал режимы , чтобы упростить интеграцию в вашу текущую (не показана) таблицу стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="ProjectRiskById" match="addProjectRisk" use="uniqueProjectId"/>

    <xsl:template match="addProjectDetail">
        <xsl:copy-of select="."/>
        <xsl:apply-templates select="key('ProjectRiskById',uniqueProjectId)[1]" 
            mode="add"/>
    </xsl:template>

    <xsl:template match="addProjectRisk" mode="add">
        <addProjectRisks>
            <xsl:copy-of select="key('ProjectRiskById',uniqueProjectId)"/>
        </addProjectRisks>
    </xsl:template>

    <xsl:template match="text()"/>

</xsl:stylesheet>

При применении к следующему входному примеру (изменено, чтобы сделать его правильно сформированным, добавив самый верхний элемент и охватить больше случаев):

<xml>
    <addProjectDetail>
        <uniqueProjectId>142</uniqueProjectId>
    </addProjectDetail>
    <addProjectDetail>
        <uniqueProjectId>915</uniqueProjectId>
    </addProjectDetail>
    <addProjectDetail>
        <uniqueProjectId>100</uniqueProjectId>
    </addProjectDetail>

    <addProjectRisks>
        <addProjectRisk>
            <uniqueProjectId>142</uniqueProjectId>
            <agencyProjectRiskId>852</agencyProjectRiskId>              
        </addProjectRisk>
        <addProjectRisk>
            <uniqueProjectId>915</uniqueProjectId>
            <agencyProjectRiskId>853</agencyProjectRiskId>  
        </addProjectRisk>   
                <addProjectRisk>
            <uniqueProjectId>915</uniqueProjectId>
            <agencyProjectRiskId>857</agencyProjectRiskId>  
        </addProjectRisk> 
    </addProjectRisks>
</xml>

Создает этот фрагмент:

<addProjectDetail>
   <uniqueProjectId>142</uniqueProjectId>
</addProjectDetail>
<addProjectRisks>
   <addProjectRisk>
      <uniqueProjectId>142</uniqueProjectId>
      <agencyProjectRiskId>852</agencyProjectRiskId>
   </addProjectRisk>
</addProjectRisks>
<addProjectDetail>
   <uniqueProjectId>915</uniqueProjectId>
</addProjectDetail>
<addProjectRisks>
   <addProjectRisk>
      <uniqueProjectId>915</uniqueProjectId>
      <agencyProjectRiskId>853</agencyProjectRiskId>
   </addProjectRisk>
   <addProjectRisk>
      <uniqueProjectId>915</uniqueProjectId>
      <agencyProjectRiskId>857</agencyProjectRiskId>
   </addProjectRisk>
</addProjectRisks>
<addProjectDetail>
   <uniqueProjectId>100</uniqueProjectId>
</addProjectDetail>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...