Изменить дату в соответствии со значением имени атрибута в XSLT - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть массив элементов, в которых элемент: value может иметь разные значения.Если элемент содержит дату в формате Зулу, то есть: 2019-04-17T10: 42: 48.0135859, мне нужно изменить ее на формат ГГГГ-ММ-ДД.Я уже придумал решение.Тем не менее, меня больше интересует соответствие 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 будет оценен.

CheersСьерра

1 Ответ

0 голосов
/ 23 апреля 2019

Выражение, которое, я думаю, вы ищете, это ...

<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 в другом пространстве имен. Единственное реальное решение - объявить пространство имен xmlns:i в XSLT, тогда вы сделаете это:

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