XSLT转换为特定的值发生

时间:2017-07-20 08:33:17

标签: xml xslt

在集成API期间,我尝试选择Tag的值与特定字符串匹配的第一个匹配项,并对所有其余字符串进行折扣。

以下是我所拥有的代码片段。

<Body>
<Envelope>
<GetCollectionResponse>
<GetCollectionResult>
    <ErrorCode>0</ErrorCode>
    <Collections>
        <Collection>
            <Service>Service One</Service>
            <Day>Tuesday</Day>
            <Date>18/07/2017</Date>
        </Collection>
        <Collection>
            <Service>Service Two</Service>
            <Day>Wednesday</Day>
            <Date>19/07/2017</Date>
        </Collection>
        <Collection>
            <Service>Service One</Service>
            <Day>Thursday</Day>
            <Date>20/07/2017</Date>
        </Collection>
    </Collections>
</GetCollectionResult>
</GetCollectionResponse>
</Envelope>
</Body>

理想情况下,我希望它能够获取第一次出现,即服务与“ Service One ”匹配 - 检索如下所示的信息,而不是第二次出现。

<Service>Service One</Service
<Day>Tuesday</Day>
<Date>18/07/2017</Date>

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

  

理想情况下,我希望它能够获取第一个出现的情况   服务匹配'服务一'

由于您需要来自此Service的多个节点,因此首先将其放在变量中可能会很方便,然后使用它来获取单个元素:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/Body">
    <!--  "the first occurence whereby the Service matches 'Service One'" is: -->
    <xsl:variable name="my-service" select="Envelope/GetCollectionResponse/GetCollectionResult/Collections/Collection[Service='Service One'][1]"/>
    <!--  output -->
    <xsl:copy-of select="$my-service/Service"/>
    <xsl:copy-of select="$my-service/Day"/>
    <xsl:copy-of select="$my-service/Date"/>
</xsl:template>

</xsl:stylesheet>

请注意,输出结构不是格式良好的XML(没有单个根元素)。

当然,在给定的示例中,您可以将其缩短为:

<xsl:template match="/Body">
    <xsl:copy-of select="Envelope/GetCollectionResponse/GetCollectionResult/Collections/Collection[Service='Service One'][1]/*"/>
</xsl:template>

获取所选Service的所有子元素。

答案 1 :(得分:0)

您可以使用XSLT的value-of元素。它获得与XPath匹配的第一个元素。请参阅说明和示例:https://www.w3schools.com/xml/xsl_value_of.asp

您的XPath可能类似于获取当天的价值:

<xsl:value-of select="/Body/Envelope/GetCollectionResponse/GetCollectionResult/Collections/Collection[Service='Service One']/Day"/>

和您日期的等价物