2015-07-16 2 views
0

Привет, мой ввод - это что-то вроде этого.Объединить все дочерние узлы соответствующего родителя под первым родителем, если значение родительского узла соответствует

<?xml version="1.0" encoding="UTF-8"?> 
     <Claim> 
      <Mileage>9837</Mileage> 
      <DamagePosition> 
       <DamageSeqNumber>3</DamageSeqNumber> 
       <DamageCode>2727004</DamageCode> 
       <PartPosition> 
        <SeqNumber>1</SeqNumber> 
        <PartNumber>A2035400253</PartNumber> 
       </PartPosition> 
      </DamagePosition> 
      <DamagePosition> 
       <DamageSeqNumber>1</DamageSeqNumber> 
       <DamageCode>2727004</DamageCode> 
       <PartPosition> 
        <SeqNumber>3</SeqNumber> 
        <PartNumber>A1409910055</PartNumber> 
       </PartPosition> 
      </DamagePosition> 
      <DamagePosition> 
       <DamageSeqNumber>8</DamageSeqNumber> 
       <DamageCode>2727004</DamageCode> 
       <OperationPosition> 
        <SeqNumber>8</SeqNumber> 
        <Opcode>02-2710-01</Opcode> 
       </OperationPosition> 
      </DamagePosition> 
      <DamagePosition> 
       <DamageSeqNumber>4</DamageSeqNumber> 
       <DamageCode>3221136</DamageCode> 
       <PartPosition> 
        <SeqNumber>4</SeqNumber> 
        <PartNumber>A2033202889</PartNumber> 
       </PartPosition> 
      </DamagePosition> 
     </Claim> 

и желаемый результат:

<?xml version="1.0" encoding="UTF-8"?> 
     <Claim> 
      <Mileage>9837</Mileage> 
      <DamagePosition> 
       <DamageSeqNumber>3</DamageSeqNumber> 
       <DamageCode>2727004</DamageCode> 
       <OperationPosition> 
        <SeqNumber>8</SeqNumber> 
        <Opcode>02-2710-01</Opcode> 
       </OperationPosition> 
       <PartPosition> 
        <SeqNumber>1</SeqNumber> 
        <PartNumber>A2035400253</PartNumber> 
       </PartPosition> 
       <PartPosition> 
        <SeqNumber>3</SeqNumber> 
        <PartNumber>A1409910055</PartNumber> 
       </PartPosition> 
       <OperationPosition> 
        <SeqNumber>8</SeqNumber> 
        <Opcode>02-2710-01</Opcode> 
       </OperationPosition> 
      </DamagePosition> 
      <DamagePosition> 
       <DamageSeqNumber>4</DamageSeqNumber> 
       <DamageCode>3221136</DamageCode> 
       <PartPosition> 
        <SeqNumber>4</SeqNumber> 
        <PartNumber>A2033202889</PartNumber> 
       </PartPosition> 
      </DamagePosition> 
     </Claim> 

Я попробовал следующий XSLT:

<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="kuserID" match="DamagePosition" use="DamageCode"/> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"> 
     <xsl:sort select="DamageCode" data-type="number"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match= 
"DamagePosition|DamageCode 
|PartPosition"/> 
<xsl:template match= 
    "DamagePosition 
    [generate-id() 
    = 
    generate-id(key('kuserID', DamageCode)[1]) 
    ]"> 
    <DamagePosition> 
    <xsl:copy-of select="DamageCode"/> 
    <xsl:apply-templates mode="copy" select="key('kuserID',DamageCode)" /> 
    </DamagePosition> 
</xsl:template> 
<xsl:template match="DamagePosition" mode="copy"> 
    <PartPosition> 
    <xsl:apply-templates/> 
    </PartPosition> 
</xsl:template> 
</xsl:stylesheet> 

, и это дает мне Ouput, как показано ниже, хотя он способен группировать дочерние элементы, имеющие одинаковый DamageCode, но не выдавая желаемого вывода, он не копирует все теги под позицию детали, только seqNumber отображается на выходе. Также любая помощь очень ценится. Спасибо за помощь.

<Claim> 
    <Mileage>9837</Mileage> 
    <DamagePosition> 
     <DamageCode>2727004</DamageCode> 
     <PartPosition> 
     <DamageSeqNumber>3</DamageSeqNumber> 
     </PartPosition> 
     <PartPosition> 
     <DamageSeqNumber>1</DamageSeqNumber> 
     </PartPosition> 
     <PartPosition> 
     <DamageSeqNumber>8</DamageSeqNumber> 
     <OperationPosition> 
      <SeqNumber>8</SeqNumber> 
      <Opcode>02-2710-01</Opcode> 
     </OperationPosition> 
     </PartPosition> 
    </DamagePosition> 
    <DamagePosition> 
     <DamageCode>3221136</DamageCode> 
     <PartPosition> 
     <DamageSeqNumber>4</DamageSeqNumber> 
     </PartPosition> 
    </DamagePosition> 
</Claim> 
+0

Я закрыл свои другие два вопроса. В будущем, пожалуйста, не отправляйте один и тот же вопрос несколько раз. –

ответ

0

У вас есть шаблон в вашем XSLT, игнорирующая PartPosition

<xsl:template match="DamagePosition|DamageCode|PartPosition"/> 

Поэтому, когда вы делаете <xsl:apply-templates/> в вашем copy шаблоне, потому что вы расположены на DamagePosition в этом пункте, выше шаблон будет сопоставьте ребенка PartPosition и просто проигнорируйте его.

Возможно, вам следует игнорировать DamageSeqNumber вместо PartPosition на этом этапе?

Кроме того, вам, вероятно, не нужен шаблон copy. Вместо этого измените вызов на него, чтобы просто получить все дочерние элементы ключа, а затем пусть шаблон удостоверения позаботится об этом.

<xsl:apply-templates select="key('kuserID',DamageCode)/*" /> 

Попробуйте XSLT

<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="kuserID" match="DamagePosition" use="DamageCode"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"> 
     <xsl:sort select="DamageCode" data-type="number"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="DamagePosition|DamageCode|DamageSeqNumber"/> 

<xsl:template match="DamagePosition[generate-id() = generate-id(key('kuserID', DamageCode)[1])]"> 
    <DamagePosition> 
    <xsl:copy-of select="DamageCode"/> 
    <xsl:copy-of select="DamageSeqNumber"/> 
    <xsl:apply-templates select="key('kuserID',DamageCode)/*" /> 
    </DamagePosition> 
</xsl:template> 
</xsl:stylesheet> 

Это не совсем дать выход вы показываете в вашем вопросе, потому что вы показываете два OperationPosition элементов в вашем выводе, хотя есть только один в вашем входе.

EDIT: Если вы хотите OperationPosition элементы, прежде чем PartPosition элементов, вы можете заменить существующий <xsl:apply-templates select="key('kuserID',DamageCode)/*" /> с этими двумя линиями вместо:

<xsl:apply-templates select="key('kuserID',DamageCode)/OperationPosition" /> 
<xsl:apply-templates select="key('kuserID',DamageCode)/*[not(self::OperationPosition)]" /> 
+0

Спасибо тонну Тим, да, вы правы в OpertaionPosition, на самом деле этот элемент на выходе должен был быть перемещен вверх и помещен ниже DamageCode, я неправильно ввел результат, этот выход должен иметь только один такой элемент, который перемещается вверх. Не могли бы вы посоветовать мне, как переместить этот элемент на желаемый уровень. Спасибо за более раннюю помощь. –

+0

Я изменил свой ответ, чтобы показать, как вы можете это сделать. –

+0

Спасибо большое .. помогло :) –

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