我的XSLT转换匹配错误

时间:2014-01-16 14:57:10

标签: xml xslt xslt-1.0

我疯了。我只想在我的xml中检索几个值:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
  <SearchDocumentResponse xmlns="http://axa.fr/gedald/2010/11">
     <SearchDocumentResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <DocumentCollection>
           <document>
              <ObjectStore i:nil="true"/>
              <DocId>{1DC43D04-2541-459C-83A7-BA6A761C64B5}</DocId>
              <IndexCollection>
                 <index>
                    <IndexId>P001</IndexId>
                    <Value>OBJ002301</Value>
                 </index>
                 <index>
                    <IndexId>P002</IndexId>
                    <Value>15/11/2013 13:00:00</Value>
                 </index>
              </IndexCollection>
           </document>
        </DocumentCollection>
        <Message i:nil="true"/>
        <NbDocument>7</NbDocument>
        <Result>OK</Result>
     </SearchDocumentResult>
  </SearchDocumentResponse>
</s:Body>
</s:Envelope>

无论我尝试作为XSL文件,我都无法获得内容。有时我会得到每个标签内容。但绝不是我想要的。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="s:Envelope/s:Body/SearchDocumentResponse/SearchDocumentResult/DocumentCollection/document/IndexCollection">
   <html>
     <body>
       <xsl:value-of select="DocId"/>
       <xsl:for-each select="index">
          <ul>
            <li><xsl:value-of select="IndexId"/></li>
            <li><xsl:value-of select="Value"/></li>
          </ul>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

源文档中的元素位于各种名称空间中,因此您需要将相同的名称空间URI绑定到样式表中的合适前缀,然后在XPath表达式中使用这些前缀:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:axa="http://axa.fr/gedald/2010/11">

  <xsl:template match="/">
   <html>
     <body>
       <xsl:apply-templates select="s:Envelope/s:Body/axa:SearchDocumentResponse/axa:SearchDocumentResult/axa:DocumentCollection/axa:document/axa:IndexCollection" />
     </body>
   </html>
  </xsl:template>


  <xsl:template match="axa:IndexCollection">
     <xsl:value-of select="axa:DocId"/>
     <xsl:for-each select="axa:index">
        <ul>
          <li><xsl:value-of select="axa:IndexId"/></li>
          <li><xsl:value-of select="axa:Value"/></li>
        </ul>
     </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

XPath 1.0表达式中的未加前缀的名称始终引用不在名称空间中的节点,这就是DocId之类的内容不选择任何内容的原因。