无法将元素与命名空间连接起来

时间:2014-12-05 08:44:05

标签: xml xpath xslt-2.0

以下XPath表达式的非常奇怪的行为:

//*[local-name() = 'Name']/text(), '-' , //*[local-name() = 'Value']/text()

我想从以下SOAP响应中检索它:     ...

<Case>
   <cam:SpecificCase xmlns:cam="http://my.namespace/CaseManagement">
      <cam:CaseType>Complaint_SenMngt</cam:CaseType>
      <cam:SpecificCaseAttribute>
         <cam:TypeName>Complaint Inquiry Claim Case</cam:TypeName>
         <cam:Name>Content Corrections</cam:Name>
         <cam:Value>false</cam:Value>
      </cam:SpecificCaseAttribute>
      <cam:SpecificCaseAttribute>
         <cam:TypeName>Complaint Inquiry Claim Case</cam:TypeName>
         <cam:Name>Formal Corrections</cam:Name>
         <cam:Value>false</cam:Value>
      </cam:SpecificCaseAttribute>
      <cam:SpecificCaseAttribute>
         <cam:TypeName>Complaint Inquiry Claim Case</cam:TypeName>
         <cam:Name>Complexity</cam:Name>
     </cam:SpecificCaseAttribute>
</Case>

我在XMLSpy中遇到以下错误:

Wrong occurrence to match required sequence type
    Details
        XPTY0004: The parameter value ('15' item(s)) at position '1' of the 'concat' function has the wrong occurrence to match the sequence type xs:anyAtomicType ('zero or one')

3 个答案:

答案 0 :(得分:0)

看起来您的xslt处理器无法决定选择三个名称/值中的哪一个。 Saxon 9适用于这个xpath并且选择了第一个Name和第一个Value,因此,对xslt处理器一无所知(我猜它是旧版本的saxon,因为错误代码是xpath2特定的),我建议重写你的xpath:

concat(//*[local-name() = 'Name']/text()[1], '-' , //*[local-name() = 'Value']/text()[1])

答案 1 :(得分:0)

假设您首先通过添加结束</cam:SpecificCase>标记来纠正XML格式正确,此XPath:

concat((//*[local-name() = 'Name'])[1], '-' , (//*[local-name() = 'Value'])[1])

将评估第一个cam:Namecam:Value元素的连接字符串值:

'Content Corrections-false'

答案 2 :(得分:0)

如果你想输出所有的值,那么一种方式就是http://xsltransform.net/pPqsHTd所示,它有

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
  xmlns:cam="http://my.namespace/CaseManagement" exclude-result-prefixes="cam">
    <xsl:output indent="yes" />

  <xsl:template match="cam:SpecificCase">
    <example1>
      <xsl:value-of select="cam:SpecificCaseAttribute/concat(cam:Name, '-', cam:Value)"/> 
    </example1>
  </xsl:template>
</xsl:transform>

并输入样本输出

<example1>Content Corrections-false Formal Corrections-false Complexity-</example1>