如何从嵌套的 xml 中获取所有值?
How can I get all the values of from a nested xml?
我收到的回复如下,我在合同中获得多个合同。响应中可能有 4、3 或 5 个合同。我想获取每个合同中所有 ContractStartDate 的值。
<Contracts xmlns="http://www.ggmd.nl/data/service/kpicontract">
<Contract>
<ContractStartDate>2015-01-01+01:00</ContractStartDate>
<ContractEndDate>2015-01-10+01:00</ContractEndDate>
<ContractSubject>02 - 0H304</ContractSubject>
</Contract>
<Contract>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractEndDate>2017-01-10+01:00</ContractEndDate>
<ContractSubject>02 - 0H304</ContractSubject>
</Contract>
<Contract>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractEndDate>2017-01-10+01:00</ContractEndDate>
<ContractSubject>02 - 0H304</ContractSubject>
</Contract>
</Contracts>
编辑
我想要如下所示:
<Dates>
<ContractStartDate>2015-01-01+01:00</ContractStartDate>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
</Dates
如何通过使用 xpath 或 xslt 或编写任何可能的解决方案脚本来获取 wso2 esb 中每个 ContractStartDate 的所有值?
由于您没有指定预期的输出,我将为您提供一个 XPATH
解决方案以从您的文件中获取 <ContractStartDate>
节点:
输入:
more contracts.xml
<Contracts xmlns="http://www.ggmd.nl/data/service/kpicontract">
<Contract>
<ContractStartDate>2015-01-01+01:00</ContractStartDate>
<ContractEndDate>2015-01-10+01:00</ContractEndDate>
<ContractSubject>02 - 0H304</ContractSubject>
</Contract>
<Contract>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractEndDate>2017-01-10+01:00</ContractEndDate>
<ContractSubject>02 - 0H304</ContractSubject>
</Contract>
<Contract>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractEndDate>2017-01-10+01:00</ContractEndDate>
<ContractSubject>02 - 0H304</ContractSubject>
</Contract>
</Contracts>
XPATH1: -> 访问 XML DOM 树
中的所有 ContractStartDate
节点
/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='ContractStartDate']
输出 1:
<ContractStartDate>2015-01-01+01:00</ContractStartDate><ContractStartDate>2017-01-01+01:00</ContractStartDate><ContractStartDate>2017-01-01+01:00</ContractStartDate>
XPATH2: -> 访问 XML DOM 树
中的所有 ContractStartDate
节点文本字段
/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='ContractStartDate']/text()
输出 2:
2015-01-01+01:002017-01-01+01:002017-01-01+01:00
之后,如果您需要根据需要格式化输出,您可以在 XSLT
样式表
中使用这个特定的 XPATH
如果你想达到你定义的输出那么你需要使用下面的XSLT
:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:redirect="http://xml.apache.org/xalan/redirect" extension-element-prefixes="redirect" xmlns:xalan="http://xml.apache.org/xslt" exclude-result-prefixes="xalan">
<xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>
<xsl:strip-space elements="*" />
<xsl:template match="/">
<dates>
<xsl:for-each select="/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='ContractStartDate']">
<ContractStartDate>
<xsl:value-of select="." />
</ContractStartDate>
</xsl:for-each>
</dates>
</xsl:template>
</xsl:stylesheet>
根据您的输入,它会产生:
$xsltproc contracts.xslt contracts.xml
<?xml version="1.0"?>
<dates>
<ContractStartDate>2015-01-01+01:00</ContractStartDate>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
</dates>
我收到的回复如下,我在合同中获得多个合同。响应中可能有 4、3 或 5 个合同。我想获取每个合同中所有 ContractStartDate 的值。
<Contracts xmlns="http://www.ggmd.nl/data/service/kpicontract">
<Contract>
<ContractStartDate>2015-01-01+01:00</ContractStartDate>
<ContractEndDate>2015-01-10+01:00</ContractEndDate>
<ContractSubject>02 - 0H304</ContractSubject>
</Contract>
<Contract>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractEndDate>2017-01-10+01:00</ContractEndDate>
<ContractSubject>02 - 0H304</ContractSubject>
</Contract>
<Contract>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractEndDate>2017-01-10+01:00</ContractEndDate>
<ContractSubject>02 - 0H304</ContractSubject>
</Contract>
</Contracts>
编辑 我想要如下所示:
<Dates>
<ContractStartDate>2015-01-01+01:00</ContractStartDate>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
</Dates
如何通过使用 xpath 或 xslt 或编写任何可能的解决方案脚本来获取 wso2 esb 中每个 ContractStartDate 的所有值?
由于您没有指定预期的输出,我将为您提供一个 XPATH
解决方案以从您的文件中获取 <ContractStartDate>
节点:
输入:
more contracts.xml
<Contracts xmlns="http://www.ggmd.nl/data/service/kpicontract">
<Contract>
<ContractStartDate>2015-01-01+01:00</ContractStartDate>
<ContractEndDate>2015-01-10+01:00</ContractEndDate>
<ContractSubject>02 - 0H304</ContractSubject>
</Contract>
<Contract>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractEndDate>2017-01-10+01:00</ContractEndDate>
<ContractSubject>02 - 0H304</ContractSubject>
</Contract>
<Contract>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractEndDate>2017-01-10+01:00</ContractEndDate>
<ContractSubject>02 - 0H304</ContractSubject>
</Contract>
</Contracts>
XPATH1: -> 访问 XML DOM 树
中的所有ContractStartDate
节点
/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='ContractStartDate']
输出 1:
<ContractStartDate>2015-01-01+01:00</ContractStartDate><ContractStartDate>2017-01-01+01:00</ContractStartDate><ContractStartDate>2017-01-01+01:00</ContractStartDate>
XPATH2: -> 访问 XML DOM 树
中的所有ContractStartDate
节点文本字段
/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='ContractStartDate']/text()
输出 2:
2015-01-01+01:002017-01-01+01:002017-01-01+01:00
之后,如果您需要根据需要格式化输出,您可以在 XSLT
样式表
XPATH
如果你想达到你定义的输出那么你需要使用下面的XSLT
:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:redirect="http://xml.apache.org/xalan/redirect" extension-element-prefixes="redirect" xmlns:xalan="http://xml.apache.org/xslt" exclude-result-prefixes="xalan">
<xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>
<xsl:strip-space elements="*" />
<xsl:template match="/">
<dates>
<xsl:for-each select="/*[local-name()='Contracts']/*[local-name()='Contract']/*[local-name()='ContractStartDate']">
<ContractStartDate>
<xsl:value-of select="." />
</ContractStartDate>
</xsl:for-each>
</dates>
</xsl:template>
</xsl:stylesheet>
根据您的输入,它会产生:
$xsltproc contracts.xslt contracts.xml
<?xml version="1.0"?>
<dates>
<ContractStartDate>2015-01-01+01:00</ContractStartDate>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
<ContractStartDate>2017-01-01+01:00</ContractStartDate>
</dates>