- ベストアンサー
xslのdocument関数で読込んだ2つのxmlをxsl:sortしたい
- xslのdocument関数を使用して読み込んだ2つのxmlをxsl:sortでソートする方法について教えてください。
- xslのdocument関数を使って読み込んだ2つのxmlをまとめてソートする方法を教えてください。
- xslのdocument関数を利用して読み込んだ2つのxmlをxsl:sortで一括してソートする方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは、なんか、変な風にとられてもいやなので、他の人の回答が付くのを待ってましたが、付かないようなので、また回答しておきます。 (また!)勘違いコメントだったらすみません。 * <xsl:for-each select="document('取り込むXMLファイル')//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> <xsl:for-each select="//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> の部分を <xsl:for-each select="//z:row|document('取り込むXMLファイル')//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> のように、まずは、1つにまとめることができます。 そうすることで、xsl:sortでまとめてsortできます。 xsl:sortについては、既知かもしれませんが <xsl:for-each select="//z:row|document('取り込むXMLファイル')//z:row"> <xsl:sort select="ソートキー" lang="ja" data-type="text" order="ascending" /> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> のように書きます。 ソートキーが数値の場合、data-typeにはnumberを 降順にするには、orderをdescendingにします。
お礼
補足させてください、 IXMLDOMDocumentPtr pDoc_xml1; IXMLDOMDocumentPtr pDoc_xml2; [XMLの読み込みは先のソースの通りです。] IXMLDOMNode *pIXMLDOMNode1 = NULL; IXMLDOMNode *pIXMLDOMNode2 = NULL; //xml1 pIXMLDOMNode1 = pDoc_xml1->selectSingleNode("//z:row"); //xml2 pIXMLDOMNode2 = pDoc_xml2>selectSingleNode("//rs:data"); //xml1+xml2 pIXMLDOMNode2->appendChild(pIXMLDOMNode1); としたのですがappendChildでエラーを起こして落ちてしまいます。 開発環境はVC++6.0 MSXML3.0です。 importNodeを使うという書き込みも見たのですが、 pDoc_xml1->としても、そのようなメソッドは現れませんでした。 アドバイスを頂けないでしょうか?
補足
ありがとうございます、 BLUEPIXYさんのアドバイスで上手くいきました! なんか変かもしれないですよね、僕はほんと感謝してますけど(笑 本当は下のようなソースでまったく同じ構造の2つのXMLソースを読み込み pDoc_xml1,pDoc_xml2をXSLでなくDOMで結合したいのですが、どうしたらよいのでしょうか? xml1,2読み込み(XMLのソース以外は同じソースです) IXMLDOMDocumentPtr pDoc_xml; IXMLDOMNodeListPtr pNodeList; IXMLDOMNode *pIXMLDOMNode=NULL; HRESULT hr; SYSTEMTIME st; GetLocalTime(&st); char szDate[64]; pDoc_xml.CreateInstance(__uuidof(DOMDocument30)); pDoc_xml->put_async(VARIANT_FALSE); pDoc_xml->validateOnParse = FALSE; sprintf(szPath_Xml, "%s\\result\\xml1.xml(またはxml2.xml)", szPath); pDoc_xml->load( _variant_t(szPath_Xml) ); sprintf(szDate, "//z:row[@INTIME>'%d/%02d/%02d 12:00:00']", st.wYear, st.wMonth, st.wDay); pNodeList = pDoc_xml->selectNodes(szDate); IXMLDOMSelection *pIXMLDOMSelection=NULL; hr = pNodeList->QueryInterface(IID_IXMLDOMSelection, (void**)&pIXMLDOMSelection ); if(SUCCEEDED(hr) && pIXMLDOMSelection){ LONG uLength; hr = pIXMLDOMSelection->get_length(&uLength); if(SUCCEEDED(hr)){ pIXMLDOMSelection->removeAll(); } } pDoc_xml->save(szPath_Xml); 結合したいのは xml1.xml(xml2.xml): <xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <s:Schema id="RowsetSchema"> <s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30"> <s:AttributeType name="MACHINE" rs:number="1" rs:nullable="true" rs:write="true"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="8190"/> </s:AttributeType> <s:AttributeType name="PARTS_NO" rs:number="2" rs:nullable="true" rs:write="true"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="8190"/> </s:AttributeType> <s:AttributeType name="STATUS" rs:number="3" rs:nullable="true" rs:write="true"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="8190"/> </s:AttributeType> <s:AttributeType name="STOCK_NUM" rs:number="3" rs:nullable="true" rs:write="true"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="8190"/> </s:AttributeType> <s:AttributeType name="INTIME" rs:number="3" rs:nullable="true" rs:write="true"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="8190"/> </s:AttributeType> <s:extends type="rs:rowbase"/> </s:ElementType> </s:Schema> <rs:data> <z:row MACHINE="APPLE" PARTS_NO="1" STATUS="WAIT" STOCK_NUM="4" INTIME="2005/09/09 12:33:11"/> <z:row MACHINE="DELL" PARTS_NO="2" STATUS="ENOUGH" STOCK_NUM="43" INTIME="2005/09/05 11:13:12"/> <z:row MACHINE="NEC" PARTS_NO="3" STATUS="EMPTY" STOCK_NUM="1" INTIME="2005/09/09 02:03:01"/> <z:row MACHINE="HP" PARTS_NO="4" STATUS="WAIT" STOCK_NUM="3" INTIME="2005/03/09 11:32:31"/> </rs:data> </xml> の xml1.xmlの<rs:data>の子のz:rowをxml2.xmlの<rs:data>の子として結合させたいです。