как сортировать элементы и группировать их на основе уникального элемента или идентификатора, который имеет пространство имен - PullRequest
1 голос
/ 01 июля 2011

я задал с тем же вопросом, но не с пространством имен

у меня есть xml вроде..это

<?xml version = '1.0' encoding = 'UTF-8'?>
<FinalDbGetUserId>
  <FinalDbGetUserIdOutputCollection xmlns:ns0="http://xmlns.oracle.com/pcbpel/adapter/db/FinalDbGetUserId"
                                    xmlns="http://xmlns.oracle.com/pcbpel/adapter/db/FinalDbGetUserId">
    <ns0:USERUBSCRIBERS>
      <ns0:USER_ID>237</ns0:USER_ID>
      <ns0:BusinessEntity>
        <ns0:NEVADA_BUSINESS_ID>NV0511201114</ns0:NEVADA_BUSINESS_ID>
        <ns0:BUSINESS_ENTITY_ID>207</ns0:BUSINESS_ENTITY_ID>
      </ns0:BusinessEntity>
    </ns0:USERUBSCRIBERS>
    <ns0:USERUBSCRIBERS>
      <ns0:USER_ID>237</ns0:USER_ID>
      <ns0:BusinessEntity>
        <ns0:NEVADA_BUSINESS_ID>NV0511201119</ns0:NEVADA_BUSINESS_ID>
        <ns0:BUSINESS_ENTITY_ID>212</ns0:BUSINESS_ENTITY_ID>
      </ns0:BusinessEntity>
    </ns0:USERUBSCRIBERS>
    <ns0:USERUBSCRIBERS>
      <ns0:USER_ID>237</ns0:USER_ID>
      <ns0:BusinessEntity>
        <ns0:NEVADA_BUSINESS_ID>NV0511201129</ns0:NEVADA_BUSINESS_ID>
        <ns0:BUSINESS_ENTITY_ID>230</ns0:BUSINESS_ENTITY_ID>
      </ns0:BusinessEntity>
    </ns0:USERUBSCRIBERS>
  </FinalDbGetUserIdOutputCollection>
</FinalDbGetUserId>

вывод должен быть как

<FinalDbGetUserId>
  <FinalDbGetUserIdOutputCollection xmlns:ns0="http://xmlns.oracle.com/pcbpel/adapter/db/FinalDbGetUserId"
                                    xmlns="http://xmlns.oracle.com/pcbpel/adapter/db/FinalDbGetUserId">
    <ns0:USERUBSCRIBERS>
      <ns0:USER_ID>237</ns0:USER_ID>
      <ns0:BusinessEntity>
        <ns0:NEVADA_BUSINESS_ID>NV0511201114</ns0:NEVADA_BUSINESS_ID>
        <ns0:BUSINESS_ENTITY_ID>207</ns0:BUSINESS_ENTITY_ID>
      </ns0:BusinessEntity>
      <ns0:BusinessEntity>
        <ns0:NEVADA_BUSINESS_ID>NV0511201119</ns0:NEVADA_BUSINESS_ID>
        <ns0:BUSINESS_ENTITY_ID>212</ns0:BUSINESS_ENTITY_ID>
      </ns0:BusinessEntity>
      <ns0:BusinessEntity>
        <ns0:NEVADA_BUSINESS_ID>NV0511201129</ns0:NEVADA_BUSINESS_ID>
        <ns0:BUSINESS_ENTITY_ID>230</ns0:BUSINESS_ENTITY_ID>
      </ns0:BusinessEntity>
    </ns0:USERUBSCRIBERS>
  </FinalDbGetUserIdOutputCollection>
</FinalDbGetUserId>

Ниже приведен 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="USERUBSCRIBERS"  use="USER_ID"/>

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


 <xsl:template match=
 "USERUBSCRIBERS|USER_ID
 |BusinessEntity"/>

 <xsl:template match=
  "USERUBSCRIBERS
    [generate-id()
    =
     generate-id(key('kuserID', USER_ID)[1])
     ]">
  <USERUBSCRIBERS>
   <xsl:copy-of select="USER_ID"/>
   <xsl:apply-templates mode="copy" select="key('kuserID',USER_ID)" />
  </USERUBSCRIBERS>
 </xsl:template>

 <xsl:template match="USERUBSCRIBERS" mode="copy">
  <BusinessEntity>
   <xsl:apply-templates/>
  </BusinessEntity>
 </xsl:template>
</xsl:stylesheet>

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

1 Ответ

1 голос
/ 01 июля 2011

Определите xmlns:ns0="http://xmlns.oracle.com/pcbpel/adapter/db/FinalDbGetUserId" для вашего элемента xsl:stylesheet, затем используйте префикс ns0 в любом месте таблицы стилей, где вы подходите или выбираете элементы из этого пространства имен, например. <xsl:key name="kuserID" match="ns0:USERUBSCRIBERS" use="ns0:USER_ID"/> и <xsl:sort select="ns0:USER_ID" data-type="number"/>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...