2016-10-13 2 views
0

у меня есть XML, как:Как переместить XML элементы в соответствии с условиями

<?xml version="1.0" encoding="UTF-8"?> 
<COLLECTION> 
<AddedBOMs NAME="AddedBOMs" TYPE="Unknown" STATUS="0"> 
<BOMHeader> 
    <Number>One</Number> 
    <StartEffectivity>One 00:00:00</StartEffectivity> 
    <EndEffectivity>One 00:00:00</EndEffectivity> 
</BOMHeader> 
</AddedBOMs> 
<ChangedBOMs NAME="ChangedBOMs" TYPE="Unknown" STATUS="0"> 
<BOMHeader> 
    <Number>Two</Number> 
    <StartEffectivity>Two 00:00:00</StartEffectivity> 
    <EndEffectivity>Two 00:00:00</EndEffectivity> 
</BOMHeader> 
</ChangedBOMs> 
<UnchangedBOMs NAME="UnchangedBOMs" TYPE="Unknown" STATUS="0"> 
<BOMHeader> 
    <Number>Three</Number> 
    <StartEffectivity>Three 00:00:00</StartEffectivity> 
    <EndEffectivity>Three 00:00:00</EndEffectivity> 
</BOMHeader> 
</UnchangedBOMs> 
<DeletedBOMComponents NAME="DeletedBOMComponents" TYPE="Unknown" STATUS="0"> 
<BOMComponent> 
    <PartNumber>Three</PartNumber> 
</BOMComponent> 
</DeletedBOMComponents> 
<AddedBOMComponents NAME="AddedBOMComponents" TYPE="Unknown" STATUS="0"> 
<BOMComponent> 
    <PartNumber>Two</PartNumber> 
</BOMComponent> 
</AddedBOMComponents> 
<ChangedBOMComponents NAME="ChangedBOMComponents" TYPE="Unknown" STATUS="0"> 
<BOMComponent> 
    <PartNumber>One</PartNumber> 
</BOMComponent> 
</ChangedBOMComponents> 
</COLLECTION> 

Я хочу, чтобы переместить StartEffectivity и EndEffectivity от AddedBOMs/BOMHeader, но она должна быть связана с ../../BOMComponent/PartNumber т. Е. Какой номер детали от BOMComponent соответствует количеству BOMHeader соответствует Соответствие StartEffectivity и EndEffectivity, скопированное внутри BOMComponent

ожидаемый выход:

<DeletedBOMComponents NAME="DeletedBOMComponents" TYPE="Unknown" STATUS="0"> 
<BOMComponent> 
    <PartNumber>Three</PartNumber> 
    <StartEffectivity>Three 00:00:00</StartEffectivity> 
    <EndEffectivity>Three 00:00:00</EndEffectivity> 
</BOMComponent> 
</DeletedBOMComponents> 
<AddedBOMComponents NAME="AddedBOMComponents" TYPE="Unknown" STATUS="0"> 
<BOMComponent> 
    <PartNumber>Two</PartNumber> 
    <StartEffectivity>Two 00:00:00</StartEffectivity> 
    <EndEffectivity>Two 00:00:00</EndEffectivity> 
</BOMComponent> 
</AddedBOMComponents> 
<ChangedBOMComponents NAME="ChangedBOMComponents" TYPE="Unknown" STATUS="0"> 
<BOMComponent> 
    <PartNumber>One</PartNumber> 
    <StartEffectivity>One 00:00:00</StartEffectivity> 
    <EndEffectivity>One 00:00:00</EndEffectivity> 
</BOMComponent> 
</ChangedBOMComponents> 

ответ

0

Логика, которая должна применяться здесь, совсем не ясна. Предполагая, что вы хотите скопировать только «компоненты», при копировании узлов из соответствующего BOMHeader, попробуйте:

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:key name="header" match="BOMHeader" use="Number" /> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/COLLECTION"> 
    <xsl:copy> 
     <xsl:apply-templates select="*[BOMComponent]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="BOMComponent"> 
    <xsl:variable name="head" select="key('header', PartNumber)" /> 
    <xsl:copy> 
     <xsl:copy-of select="PartNumber"/> 
     <xsl:copy-of select="$head/StartEffectivity | $head/EndEffectivity"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

Спасибо большое он работал для меня. Но остальная часть XML должна быть одинаковой. он не должен падать. –

+0

Еще одна вещь, которую мне нужно спросить, возможно ли это? в случае DeletedBOMComponents/BOMComponent. Функция StartEffectivity должна быть нулевой, а EndEffectivity будет содержать значение StartEffectivity от BOMHeader. –

+0

@eddie. Если вы хотите сохранить элементы «header», просто удалите второй шаблон. - WRT к дополнительному требованию, я ответил на это в другом вопросе. –