2016-05-03 1 views
0

У меня есть требование, необходимо скопировать всю информацию родительского узла для каждого дочернего ссылочного узла. не может понять самостоятельно. Любая помощь будет высоко оценена. Вот код преобразования. Необходимо скопировать всю информацию от родителя для каждого «Relationship_410».Создайте новые узлы для детей и скопируйте информацию о родителях с помощью XSLT

<xsl:template match="/ns0:Records" mode="pass2"> 
     <Records xmlns="http://www.tech.com/"> 
      <xsl:for-each select="ns0:Record"> 
      <xsl:for-each select="ns0:Relationship_397"> 
<xsl:for-each select="ns0:Relationship_410"> 
       <Record>   
       <xsl:copy-of select="./node()[not(self::ns0:Relationship_410)]"></xsl:copy-of> 
       </Record> 
</xsl:for-each> 
      </xsl:for-each> 
      </xsl:for-each> 
     </Records> 
     </xsl:template> 

ВХОД:

<Records> 
    <Record> 
     <Tracking_ID>7</Tracking_ID> 
     <Relationship_397> 
     <Field_contentId>12099237</Field_contentId>  
     <Relationship_410> 
      <Field_contentId>12102605</Field_contentId>   
      <Issue_Criticality> 
      <Item>High</Item> 
      </Issue_Criticality>   
     </Relationship_410> 
      <Relationship_410> 
      <Field_contentId>test -- 12102605</Field_contentId>   
      <Issue_Criticality> 
      <Item>test --High</Item> 
      </Issue_Criticality>   
     </Relationship_410> 
     <Relationship_49> 
      <Field_contentId>7358689</Field_contentId> 
      <Tracking_ID>7358689</Tracking_ID> 
     </Relationship_49>   
     </Relationship_397> 
     <Relationship_124> 
     <Field_contentId>5981551</Field_contentId>  
     </Relationship_124> 
     <Relationship_124> 
     <Field_contentId>5985378</Field_contentId>   
     </Relationship_124> 
    </Record> 
    </Records> 

ВЫВОД

<Records> 
    <Record> 
    <Tracking_ID>7</Tracking_ID> 
    <Relationship_397> 
     <Field_contentId>12099237</Field_contentId> 
     <Relationship_410> 
     <Field_contentId>12102605</Field_contentId> 
     <Issue_Criticality> 
      <Item>High</Item> 
     </Issue_Criticality> 
     </Relationship_410> 
     <Relationship_49> 
     <Field_contentId>7358689</Field_contentId> 
     <Tracking_ID>7358689</Tracking_ID> 
     </Relationship_49> 
    </Relationship_397> 
    <Relationship_124> 
     <Field_contentId>5981551</Field_contentId> 
    </Relationship_124> 
    <Relationship_124> 
     <Field_contentId>5985378</Field_contentId> 
    </Relationship_124> 
    </Record> 
    <Record> 
    <Tracking_ID>7</Tracking_ID> 
    <Relationship_397> 
     <Field_contentId>12099237</Field_contentId> 
     <Relationship_410> 
     <Field_contentId>test -- 12102605</Field_contentId> 
     <Issue_Criticality> 
      <Item>test --High</Item> 
     </Issue_Criticality> 
     </Relationship_410> 
     <Relationship_49> 
     <Field_contentId>7358689</Field_contentId> 
     <Tracking_ID>7358689</Tracking_ID> 
     </Relationship_49> 
    </Relationship_397> 
    <Relationship_124> 
     <Field_contentId>5981551</Field_contentId> 
    </Relationship_124> 
    <Relationship_124> 
     <Field_contentId>5985378</Field_contentId> 
    </Relationship_124> 
    </Record> 
</Records> 
+2

Не могли бы вы минимизировать пример к необходимому минимуму, чтобы продемонстрировать эту проблему? См.: [Mcve] –

+0

Я удалил все ненужные вещи. Извини за это. Спасибо, что посмотрели. – redsam

+0

Это все еще довольно запутанно, потому что ваши XSLT ссылаются на узлы в пространстве имен, а ваш XML - нет. Я опубликовал ответ, основанный исключительно на показанных вводах и выводах. –

ответ

1

AFAICT, требуемая мощность может быть получена довольно легко:

XSLT 1,0

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

<xsl:template match="/Records"> 
    <Records> 
     <xsl:for-each select="//Relationship_410"> 
      <Record> 
       <xsl:copy-of select="../../Tracking_ID"/> 
       <Relationship_397> 
        <xsl:copy-of select="../../Relationship_397/Field_contentId"/> 
        <xsl:copy-of select="."/> 
        <xsl:copy-of select="../Relationship_49"/> 
       </Relationship_397> 
       <xsl:copy-of select="../../Relationship_124"/> 
      </Record> 
     </xsl:for-each> 
    </Records> 
</xsl:template> 

</xsl:stylesheet> 
+0

Спасибо Майку за то, что вы легко поняли решение. – redsam

1

Вы можете попробовать что-то вроде этого:

<xsl:template match="@*|node()"> 
    <xsl:param name="r410" /> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*" > 
       <xsl:with-param name="r410" select="$r410" /> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Relationship_410"> 
     <xsl:param name="r410" /> 
     <xsl:if test="$r410 = generate-id(.)" > 
     <xsl:copy> 
      <xsl:apply-templates /> 
     </xsl:copy> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="/Records"> 
    <xsl:copy> 
     <xsl:apply-templates select="//Relationship_410" mode="gen410" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Relationship_410" mode="gen410"> 
     <xsl:apply-templates select="ancestor::Record"> 
     <xsl:with-param name="r410" select="generate-id(.)" /> 
     </xsl:apply-templates> 
    </xsl:template>