3

XPATH と XSLT を使用して、特定の方法で XML からデータを引き出す必要があります。

<data>      
    <person id="p1">         
        <name>User1</name>      
    </person>   
    <person id="p2">         
        <name>User2</name>      
    </person>  
    <person id="p3">         
        <name>User3</name>      
    </person>       
    <employee eid="emp1" pid="p1">         
        <dept>dept1</dept>      
    </employee> 
    <employee eid="emp2" pid="p3">         
        <dept>dept3</dept>      
    </employee>
    <employee eid="emp3" pid="p2">         
        <dept>dept1</dept>      
    </employee>
</data>

上記の例から、出力 xml 内の Person 要素と対応する Employee 要素を使用して、それぞれの XML を作成する必要があります。これら 2 つの xml 間のリンクは次のとおりです。

person.id = 従業員.pid

XML1 のように:

<person id="p1">         
<name>User1</name>      
</person>  
<employee eid="emp1" pid="p1">         
<dept>dept1</dept>      
</employee>

XML2:

<person id="p2">         
<name>User2</name>      
</person> 
<employee eid="emp3" pid="p2">         
 <dept>dept1</dept>      
</employee>

XML3:

<person id="p3">         
<name>User3</name>      
</person> 
<employee eid="emp2" pid="p3">         
<dept>dept3</dept>      
</employee>  

私は多くの方法を試しましたが、これを取得できませんでした。

ありがとう...

4

2 に答える 2

2

XPath は XML ドキュメントのクエリ言語です。そのため、XPath 式を評価しても、既存のドキュメントを変更したり、新しい XML ドキュメントを作成したりすることはできません

XSLT 2.0 (結果ドキュメントが 1 つだけ必要な場合は XSLT 1.0) を使用すると、目的を達成するのに最適です。

<xsl:stylesheet version="2.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="kEmpByPid" match="employee" use="@pid"/>

 <xsl:template match="person">
  <xsl:result-document href="file:///c:/temp/delete/XML{position()}">
      <t>
             <xsl:copy-of select=".|key('kEmpByPid', @id)"/>
         </t>
     </xsl:result-document>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

この XSLT 2.0 変換が提供された XML ドキュメントに適用されると、次のようになります。

<data>
    <person id="p1">
        <name>User1</name>
    </person>
    <person id="p2">
        <name>User2</name>
    </person>
    <person id="p3">
        <name>User3</name>
    </person>
    <employee eid="emp1" pid="p1">
        <dept>dept1</dept>
    </employee>
    <employee eid="emp2" pid="p3">
        <dept>dept3</dept>
    </employee>
    <employee eid="emp3" pid="p2">
        <dept>dept1</dept>
    </employee>
</data>

次の 3 つの XML ドキュメントが「c:\temp\delete」に作成されます。

XML1 :

<t>
   <person id="p1">
      <name>User1</name>
   </person>
   <employee eid="emp1" pid="p1">
      <dept>dept1</dept>
   </employee>
</t>

XML2 :

<t>
   <person id="p2">
      <name>User2</name>
   </person>
   <employee eid="emp3" pid="p2">
      <dept>dept1</dept>
   </employee>
</t>

XML3 :

<t>
   <person id="p3">
      <name>User3</name>
   </person>
   <employee eid="emp2" pid="p3">
      <dept>dept3</dept>
   </employee>
</t>
于 2012-10-19T18:44:25.467 に答える
0

上記の問題に対して、以下の解決策があります。

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" />
    <xsl:strip-space elements="*" />

    <xsl:template match="//person">
        <xsl:variable name="ID" select="@id" />
        <xsl:result-document href="file:///c:/temp/delete/XML{position()}">
        <t>
            <xsl:copy-of select=". | //employee[@pid=$ID]" />
        </t>                
        </xsl:result-document>
    </xsl:template>
    <xsl:template match="text()" />
</xsl:stylesheet>

あなたと共有したかっただけです。

ありがとう。

于 2012-10-23T19:55:16.777 に答える