1

私は XSLT の初心者です。私のソース XML:

<Request>
   <Documents>
      <Doc Type="A">123</Doc>
      <Doc Type="C">345</Doc>
   </Documents>
</Request>

私の応答 XML:

<Response>
   <RequestedDoc>
       <Doc Type="A">123</Doc>
       <Doc Type="C">345</Doc>
   </RequestedDoc>
   <Result>
      <Document>
         <Id>A123</Id>
         <Name>Doc1</Name>
      </Document>
      <Document>
         <Id>E143</Id>
         <Name>Doc2</Name>
      </Document>
      <Document>
         <Id>C345</Id>
         <Name>Doc3</Name>
      </Document>
      <Document>
         <Id>D153</Id>
         <Name>Doc4</Name>
      </Document>
   </Result>
</Response>

Resultタグを使用してタグをフィルタリングする必要がありますRequestedDoc。XSLT の下で試してみましたが、最初の結果しか返されません。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml" indent="yes" />
   <xsl:variable name="requestedDoc" select="//RequestedDoc/Doc"/>

   <xsl:template match="Response">
      <xsl:element name="FilterResult">
          <xsl:apply-templates select="//Result/Document[contains(Id,$requestedDoc)]"/>
      </xsl:element>
   </xsl:template>

   <xsl:template match="Document">
      <xsl:element name="Name">
         <xsl:value-of select="Name"/>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>

しかし、この XSLT は常に first のデータを返しますDoc A123

<FilterResult>
  <Name>Doc1</Name>
</FilterResult>

期待される結果は

<FilterResult>
  <Name>Doc1</Name>
  <Name>Doc3</Name>
</FilterResult>

助けてください。

4

1 に答える 1

1

この変換:

<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:template match="/*">
     <FilterResult>
      <xsl:apply-templates/>
     </FilterResult>
 </xsl:template>

 <xsl:template match="Document[substring(Id,2) = /*/RequestedDoc/*]">
  <xsl:copy-of select="Name"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

提供された応答文書に適用された場合:

<Response>
   <RequestedDoc>
       <Doc Type="A">123</Doc>
       <Doc Type="C">345</Doc>
   </RequestedDoc>
   <Result>
      <Document>
         <Id>A123</Id>
         <Name>Doc1</Name>
      </Document>
      <Document>
         <Id>E143</Id>
         <Name>Doc2</Name>
      </Document>
      <Document>
         <Id>C345</Id>
         <Name>Doc3</Name>
      </Document>
      <Document>
         <Id>D153</Id>
         <Name>Doc4</Name>
      </Document>
   </Result>
</Response>

必要な正しい結果が生成されます。

<FilterResult>
   <Name>Doc1</Name>
   <Name>Doc3</Name>
</FilterResult>
于 2012-11-09T13:37:51.263 に答える