我有这个包含证书及其属性的xml。这是我运行提取查询的xml
<Certificates>
<CertificateAndChain>
<Certificate>
<FriendlyName />
<Thumbprint>EE8B375347FCADDC25547FDDF61866E07D5B6A71</Thumbprint>
<SerialNumber>256BB11DB5BE889E46EBCD85608DA849</SerialNumber>
<Version>3</Version>
<SignatureAlgorithm>sha1RSA</SignatureAlgorithm>
<Issuer>CN=certname</Issuer>
<Subject>CN=certname</Subject>
<NotAfter>2040-09-26T18:30:00Z</NotAfter>
<NotBefore>2016-09-27T18:30:00Z</NotBefore>
<IsVerified>false</IsVerified>
</Certificate>
。 。 (续)...
我已经在这个xml上编写了另一个测试,需要提取即将在未来10天内过期的所有证书的指纹。 作为测试的一部分,我将Extraction查询编写为:
<XPath2ResponseParameter Name="TPName"><ExtractionQuery><![CDATA[string(//CertificateAndChain/Certificate[NotAfter[text() <= (current-dateTime() + xs:dayTimeDuration('P10D'))]]/Thumbprint)]]></ExtractionQuery></XPath2ResponseParameter>
测试也在xml文件中。但是,当我运行测试时,我得到以下异常: 不允许包含多个项目的序列作为string()的第一个参数。 这可能是因为xml中存在多个证书元素。所以,我无法弄清楚如何提取所有指纹未能达到上述条件的方法(可能超过1,我需要提取所有指纹)
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:0)
使用XPath 2.0时,可以在轴上调用函数。因此,尝试将string()
函数移动到内部XPath的末尾(为便于阅读而格式化):
//CertificateAndChain
/Certificate[
NotAfter[
text() <= (current-dateTime() + xs:dayTimeDuration('P10D'))
]
]/Thumbprint
/string()
更新:
由于CDATA在此上下文中无法接收多个字符串,因此根据您第一条评论中的错误消息,您需要将这些字符串组合成一个字符串,大概是使用string-join()
:
string-join(
//CertificateAndChain
/Certificate[
NotAfter[
text() <= (current-dateTime() + xs:dayTimeDuration('P10D'))
]
]/Thumbprint
/string()
,' ')