2015-02-17 5 views
1

Я хочу вставить элемент в элемент предка, если условие истинно в элементе-потомке. Как внизу xml я хочу вставить новый элемент «синий» внутри элемента «part», который значение потомок элемента «patternCode» .The элемент должен быть вставлен только если оба элемента «patternCode» имеют такое же значение «синий» Примечание: есть 2 patternCode элементы XML, которые должны быть сопоставленыВставка элемента в узел предка в xslt

<Request > 
    <Part> 
     <Lines> 
      <Entry> 
       <entity> 
        <Cover> 
         <Entry> 
          <Terms> 
           <Entry> 
            <DisplayValue/> 
            <PatternCode>Blue</PatternCode> 
            <ValueTypeName>bit</ValueTypeName> 
           </Entry> 
          </Terms> 
          <Pattern> 
           <Description>white</Description> 
           <Name>white</Name> 
          </Pattern> 
          <PatternCode>Blue</PatternCode> 
          <PublicID>pc</PublicID> 
         </Entry> 
        </Cover> 
        <Locations> 
         <!-- other data--> 
        </Locations> 
       </entity> 
      </Entry> 
     </Lines> 
    </Part> 
</Request> 

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

<Request > 
    <Part> 
    <Blue> <Blue> 
     <Lines> 
      <Entry> 
       <entity> 
        <Cover> 
         <Entry> 
          <Terms> 
           <Entry> 
            <DisplayValue/> 
            <PatternCode>Blue</PatternCode> 
            <ValueTypeName>bit</ValueTypeName> 
           </Entry> 
          </Terms> 
          <Pattern> 
           <Description>white</Description> 
           <Name>white</Name> 
          </Pattern> 
          <PatternCode>Blue</PatternCode> 
          <PublicID>pc</PublicID> 
         </Entry> 
        </Cover> 
        <Locations> 
         <!-- other data--> 
        </Locations> 
       </entity> 
      </Entry> 
     </Lines> 
    </Part> 
</Request> 

Что я тi ред

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

    <xsl:template match="Request/Part/Lines/Entry/entity/Cover" > 
    <xsl:copy> 
     <xsl:for-each select="Entry"> 
      <xsl:copy> 
        <xsl:apply-templates select="@* | node()" /> 
      </xsl:copy> 
     <xsl:variable name="x"> 
     <xsl:value-of select="PatternCode"/> 
     </xsl:variable> 

     <xsl:for-each select="Terms/Entry">   
      <xsl:variable name="y"> 
      <xsl:value-of select="PatternCode"/> 
       </xsl:variable> 
        <xsl:if test="$x=$y"> 
         <xsl:call-template name="compute" > 
           <xsl:with-param name="value" select="$y"/> 
         </xsl:call-template> 
        </xsl:if> 
       </xsl:for-each> 
     </xsl:for-each> 
    </xsl:copy> 
     </xsl:template> 

    <xsl:template name="compute" > 
    <xsl:param name="value"/> 
     <xsl:for-each select="Part"> 
     <xsl:element name="{$value}"></xsl:element> 
    <xsl:for-each >     
    </xsl:template> 

    </xsl:stylesheet> 
+0

Не могли бы вы пожалуйста, отправьте XSLT, который вы пробовали. И, пожалуйста, укажите версию XSLT, которую вы используете. –

ответ

0

Вы должны подойти к этому наоборот:

<template match="part"> 
<xsl:if test="descendant::cover/entry/terms/entry/patterncode = descendant::cover/entry/patterncode"> 
insert the <blue> node here 

Это гораздо проще изменить элемент вы сейчас работаете.

0

Я считаю, что это нужно сделать:

XSLT1.0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Part"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:if test="count(.//PatterCode) = count(.//PatterCode[. = (current()//PatternCode)[1]])"> 
       <Blue/> 
      </xsl:if> 
      <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

И я думаю, что XSLT2.0 бы сделать это еще проще и эффективнее:

XSLT2.0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Part[count(.//PatterCode) = count(.//PatterCode[. = (current()//PatternCode)[1]])]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <Blue/> 
      <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
Смежные вопросы