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 总是首先返回数据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 回答