按照与XSLT中的属性名称值匹配的方式修改日期

时间:2019-04-22 09:59:40

标签: xslt xslt-1.0

我有一个元素数组,其中a:value元素可以具有不同的值。如果元素包含Zulu格式的日期,即:2019-04-17T10:42:48.0135859,我需要将其更改为YYYY-MM-DD格式。我已经想出了一个解决方案。但是,我对符合条件的i:type =“ b:dateTime”更加感兴趣。这意味着如果i:type等于或包含b:dateTime,则XSLT将获取日期并进行所需的转换。

输入的XML是:

<Properties
xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
>
<a:KeyValueOfstringanyType>
<a:Key>dtDynamicModifyDate</a:Key>
<a:Value i:type="b:dateTime"
xmlns:b="http://www.w3.org/2001/XMLSchema"
>2019-04-17T10:42:48.0135859</a:Value>
</a:KeyValueOfstringanyType>
<a:KeyValueOfstringanyType>
<a:Key>tiEnrollmentStatus</a:Key>
<a:Value i:type="b:string"
xmlns:b="http://www.w3.org/2001/XMLSchema"
>Enrolled</a:Value>
</a:KeyValueOfstringanyType>
<a:KeyValueOfstringanyType>
<a:Key>tiNumberOfEnrollments</a:Key>
<a:Value i:type="b:int"
xmlns:b="http://www.w3.org/2001/XMLSchema"
>1</a:Value>
</a:KeyValueOfstringanyType>
<a:KeyValueOfstringanyType>
<a:Key>dtModifyDate</a:Key>
<a:Value i:type="b:dateTime"
xmlns:b="http://www.w3.org/2001/XMLSchema"
>2019-04-16T15:57:39.331-04:00</a:Value>
</a:KeyValueOfstringanyType>
</Properties>

可以在此处进行转换:https://xsltfiddle.liberty-development.net/ncdD7mC/1

我希望检查上述条件而不是这种情况(i:type等于或包含b:dateTime)

<xsl:when test="contains($payload/*[local-name()='Value'], '-') and contains($payload/*[local-name()='Value'], 'T') and contains($payload/*[local-name()='Value'], ':')"> 

XPATH的任何指针都会受到赞赏。

干杯, 塞拉利昂

1 个答案:

答案 0 :(得分:0)

我想您正在寻找的表情是这个...

<xsl:when test="$payload/*[local-name()='Value']/@*[name()='i:type'] ='b:dateTime'">

但是,如果更改名称空间前缀,这将失败,所以也许您应该这样做:

<xsl:when test="$payload/*[local-name()='Value']/@*[local-name()='type'] ='b:dateTime'">

但是,如果您在不同的命名空间中有两个名为type的属性,则可能无法获得正确的结果。唯一真正的解决方案是在XSLT中声明xmlns:i命名空间,然后您将执行以下操作:

<xsl:when test="$payload/*[local-name()='Value']/@i:type ='b:dateTime'">