2016-12-02 5 views
0

У меня есть этот выход XMLСортировка в XML с помощью XSLT

<root> 
    <row> 
     <Additional_Information> 
      <OrgID>SO_000048333</OrgID> 
      <ParentOrgID>SO_000337522</ParentOrgID> 
     </Additional_Information> 
     <Additional_Information> 
      <OrgID>SO_000001780</OrgID> 
      <ParentOrgID>TOP_MOST_ORG</ParentOrgID> 
     </Additional_Information> 
     <Additional_Information> 
      <OrgID>SO_000041599</OrgID> 
      <ParentOrgID>SO_000001780</ParentOrgID> 
     </Additional_Information> 
     <Additional_Information> 
      <OrgID>SO_3-23773</OrgID> 
      <ParentOrgID>SO_000253386</ParentOrgID> 
     </Additional_Information> 
     <Additional_Information> 
      <OrgID>SO_000305947</OrgID> 
      <ParentOrgID>SO_000001780</ParentOrgID> 
     </Additional_Information> 
     <Additional_Information> 
      <OrgID>SO_000121212</OrgID> 
      <ParentOrgID>SO_000046509</ParentOrgID> 
     </Additional_Information> 
     <Additional_Information> 
      <OrgID>SO_000034169</OrgID> 
      <ParentOrgID>SO_000305947</ParentOrgID> 
     </Additional_Information> 
     <Additional_Information> 
      <OrgID>SO_000033807</OrgID> 
      <ParentOrgID>SO_000048333</ParentOrgID> 
     </Additional_Information> 
     <Additional_Information> 
      <OrgID>SO_000337522</OrgID> 
      <ParentOrgID>TOP_MOST_ORG</ParentOrgID> 
     </Additional_Information> 
     <Additional_Information> 
      <OrgID>SO_000030934</OrgID> 
      <ParentOrgID>SO_000033807</ParentOrgID> 
     </Additional_Information> 
     <Additional_Information> 
      <OrgID>SO_000253386</OrgID> 
      <ParentOrgID>SO_000030934</ParentOrgID> 
     </Additional_Information> 
     <Additional_Information> 
      <OrgID>SO_000046509</OrgID> 
      <ParentOrgID>SO_000001780</ParentOrgID> 
     </Additional_Information> 
    </row> 
</root> 

OrgIDs/ParentOrgIDs имеет 2 формы: SO_XXXXXXXXX и SO_3-XXXXX

Я использую XSLT 2.0

Я хочу, чтобы это было отсортировано следующим образом
SO_000001780 (2-й уровень в иерархии, с ParentOrgID = TOP_MOST_ORG)
-SO_000041599 (ребенок второго уровня)
-SO_000046509 (еще одного ребенка 2-го уровня)
--SO_000121212 (ребенок 3-го уровня в иерархии)
-SO_000305947 (еще одного ребенка 2-го уровня)
--SO_000034169 (ребенок 3-го уровня в иерархии)
SO_00033752
-SO_000048333
--SO_000033807
--- SO_000030934
---- SO_000253386
----- SO_3-23773

Любая помощь высоко ценится! Я все еще учу XSLT.

+0

Я не понимаю, ваше описание. Измените свой вопрос и предоставьте пошаговый алгоритм для определения порядка сортировки (предположите, что вы объясняете это глупому человеку, который будет выполнять задачу вручную). - Также укажите, используете ли XSLT 1.0 или 2.0. –

+0

Это все еще не ясно. Вы хотите перечислить все узлы на одном уровне в непрерывном блоке, или вы хотите, чтобы ребенок был указан сразу после его родителя? –

ответ

0

Это на самом деле не вопрос сортировочного как таковой, а скорее вложенности записи в соответствии с их иерархией - даже если вы указали плоский файл в качестве ожидаемого результата.

Попробуй так:

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="child" match="Additional_Information" use="ParentOrgID" /> 

<xsl:template match="/root"> 
    <root> 
     <xsl:apply-templates select="key('child', 'TOP_MOST_ORG')"/> 
    </root> 
</xsl:template> 

<xsl:template match="Additional_Information"> 
    <xsl:copy-of select="."/> 
    <xsl:apply-templates select="key('child', OrgID)"/> 
</xsl:template> 

</xsl:stylesheet> 

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

  • Нет связанных вопросов^_^