2012-02-14 2 views
2

Учитывая следующий XML:XPath подстрока-после

<?xml version="1.0"?> 
<purchaseOrder orderDate="1999-10-20"> 
    <shipTo country="US"> 
     <name>Alice Smith</name> 
     <street>123 Maple Street</street> 
     <city>Mill Valley</city> 
     <state>CA</state> 
     <zip>90952</zip> 
    </shipTo> 
    <billTo country="US"> 
     <name>Robert Smith</name> 
     <street>8 Oak Avenue</street> 
     <city>Old Town</city> 
     <state>PA</state> 
     <zip>95819</zip> 
    </billTo> 
    <comment>Hurry, my lawn is going wild!</comment> 
    <items> 
     <item partNum="872-AA"> 
      <productName>Lawnmower</productName> 
      <quantity>1</quantity> 
      <USPrice>148.95</USPrice> 
      <comment>Confirm this is electric</comment> 
     </item> 
     <item partNum="926-AA"> 
      <productName>Baby Monitor</productName> 
      <quantity>1</quantity> 
      <USPrice>39.98</USPrice> 
      <shipDate>1999-05-21</shipDate> 
     </item> 
    </items> 
</purchaseOrder> 

, как я выбираю '98' из USPrice во 2-й ст. Я пробовал:

purchaseOrder/items/item[USPrice[text()='39.98']]/USPrice/substring-after(.,'.') 

но продолжают давать мне ошибку 'has an invalid token'

если я пытаюсь:

purchaseOrder/items/item[USPrice[text()='39.98']]/USPrice/text()[substring-after(.,'.')] 

или

purchaseOrder/items/item[USPrice[text()='39.98']]/USPrice[substring-after(text(),'.')] 

Я получаю '39.98', что неправильно слишком.

Я тестирую с помощью сайта здесь:

http://www.xmlme.com/XpathTool.aspx

ответ

2

строго говоря, что вы не можете сделать это с помощью XPath 1,0

с помощью XSLT следующее будет работать, но я не думаю, что это что вам требуется

<xsl:value-of select="substring-after(purchaseOrder/items/item[2]/USPrice,'.')"/> 

пожалуйста, обратитесь к этому подобному вопросу для получения дополнительной информации

How to apply the XPath function 'substring-after'

+0

Знаете ли вы, что XPath 2.0 для .NET? – smolesen

+0

@smolesen Проверьте ответы на этот вопрос: http://stackoverflow.com/q/1525299/26396 –

+0

Я знаю, что .NET поддерживает только XSLT v1.0, поэтому я также подозреваю его XPATH v1.0. Я думаю, что есть сторонние реализации, эта ссылка имеет больше информации http://stackoverflow.com/questions/1525299/xpath-and-xslt-2-0-for-net – Treemonkey

1

Выражение XPath вы после:

substring-after(/purchaseOrder/items/item[2]/USPrice, '.') 

Вы можете оценить это выражение XPath непосредственно в C# код (без XSLT) с использованием XPathNavigator.Evaluate()

0

Сохранить значение /purchaseOrder/items/item[2]/USPrice в переменную (скажем, цена), а затем используйте $Price - floor($Price) для расчета фракционной части цены.

Использование substring-after() ничего не вернет, если значение равно четному числу долларов, что может привести к тому, что остальная часть преобразования вернет неправильные результаты.

Смежные вопросы