2016-04-26 12 views
0

У меня есть документ XMLXPath 1.0 установить значение несуществующего атрибута

<?xml version="1.0" encoding="UTF-16"?> 
<APIDATA xmlns="api-com"> 
<ORDER EngineID="1" OrderID="66" OtherInfo="100"><INSTSPECIFIER InstID="27" SeqID="17"/>  
</ORDER> 
<ORDER EngineID="2" OrderID="67" OtherInfo="200"><INSTSPECIFIER InstID="28" SeqID="18"/>  
</ORDER> 
<ORDER EngineID="3" OrderID="68"><INSTSPECIFIER InstID="29" SeqID="19"/></ORDER> 
</APIDATA> 

Как я получить значение атрибута OtherInfo с помощью XPath , но когда он не существует, я хочу Null быть возвращены

Если я использовал следующий XPATH/APIDATA/ORDER/@ OtherInfo я получить выход в

100 
200 

Но поскольку для OrderID 68 OtherInfo отсутствует я хочу выход быть

100 
200 
0 

Существует пост здесь что близко к моему решению, но я как-то не могу заставить его работать Can I create a value for a missing tag in XPath?

+1

AFAIK, я не» t думаю, что это прямо выполнимо ... вы можете попросить xpath вернуть true или false и позволить вам программировать логику return null или иным образом соответствующим образом ... –

ответ

0

К сожалению, такой подход в ответ на связанный вопрос только работать, если есть только одно значение, которое должно быть возвращено из данного XML-документа (см. ниже для демонстрации по этому вопросу). Поэтому, учитывая образец XML, размещенный в этом вопросе, короткий ответ будет это невозможно, используя чистый XPath 1.0.

Если XPath используется на языке программирования, одним из возможных подходов было бы использование выражения XPath, которое всегда возвращает значение, например /APIDATA/ORDER. Затем для каждого возвращаемого элемента <ORDER> существует множество опций для получения атрибута OtherInfo и предоставления значения по умолчанию в случае, если атрибут не найден.


Применяя связанный почтовый подход к вашему делу будет приводит к следующему выражению XPath:

substring(concat("0", //ORDER[3]/@OtherInfo), 2 * number(boolean(//ORDER[3]/@OtherInfo))) 

XPath успешно возвращают 0 при нанесении на 3-й <ORDER> элемент, который не имеет атрибут OtherInfo, см. демо *: xpathtester, xpatheval

По умолчанию пространство имен было удалено в демо для упрощения ING в XPath


Реализация одного и того же подхода в XSLT 1.0, в соответствии с просьбой:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="api-com"> 
    <xsl:output method="text" indent="yes"/> 

    <xsl:template match="d:ORDER"> 
    <xsl:value-of select="substring(concat('0', @OtherInfo), 2 * number(boolean(@OtherInfo)))"/> 
    </xsl:template> 
</xsl:stylesheet> 

выход:

100 
200 
0 

Демо: xpathtester

+0

Спасибо har07 за то, что посмотрели на это и помогли мне выйти. Могу ли я это сделать с помощью XSLT? –

+0

@ jhon.smith обновил мой ответ с помощью демонстрации XSLT – har07