Вернуть "последний" узел в наборе повторяющихся узлов
Мне нужно адаптировать следующее выражение XPath, чтобы вернуть "Последние" Amend_Start_Date
из образца XML (из MS InfoPath):
//my:Amend_Data[0=count(following-sibling::my:Amend_Data)]//my:Amend_Start_Date
И XML:
<?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.440" productVersion="14.0.0" PIVersion="1.0.0.0" href="file:///C:\Documents%20and%20Settings\Chris\Local%20Settings\Application%20Data\Microsoft\InfoPath\Designer3\1c02663d7ed84d09\manifest.xsf" ?><?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?><?mso-infoPath-file-attachment-present?><my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-05-05T19:56:08" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-us">
<my:MasterSection>
<my:Planning_Section>
<my:Planned_Start_Date>2012-09-12</my:Planned_Start_Date>
<my:Planned_End_Date>2012-09-14</my:Planned_End_Date>
</my:Planning_Section>
<my:Actual_Section>
<my:Actual_Start_Date>2012-09-13</my:Actual_Start_Date>
<my:Actual_End_Date>2012-09-15</my:Actual_End_Date>
</my:Actual_Section>
<my:Amend_Hider>
<my:Amend_Info_Repeater_Group>
<my:Amend_Info_Repeater>
<my:Amend_Data>
<my:Amend_Start_Date>2012-09-16</my:Amend_Start_Date>
<my:Amend_End_Date>2012-09-21</my:Amend_End_Date>
</my:Amend_Data>
</my:Amend_Info_Repeater>
<my:Amend_Info_Repeater>
<my:Amend_Data>
<my:Amend_Start_Date>2012-09-23</my:Amend_Start_Date>
<my:Amend_End_Date>2012-09-27</my:Amend_End_Date>
</my:Amend_Data>
</my:Amend_Info_Repeater>
</my:Amend_Info_Repeater_Group>
</my:Amend_Hider>
</my:MasterSection>
Я начал использовать XPath в прошлый четверг... Так что простите меня, если мне нужно кормить с ложечки. В этом виде перечисленное выражение возвращает все узлы даты начала из образца XML. Он предназначен для возвращения "Последние" Amend_Start_Date
но не потому, что структура XML такова, что Amend_Start_Date
узлы не сгруппированы вместе. В этом примере это будет означать, что правильное выражение вернет дату начала 2012-09-23
и НЕ 2012-09-16
Должен быть способ, которым это может быть достигнуто! Каким-то образом относительный путь Amend_Data
узел должен быть изменен... Любая помощь приветствуется!
PS: Это относится к вопросу, который я разместил в пятницу, который можно найти здесь. Вы можете заметить структурное различие в образце XML, указанном в этом вопросе, против этого.
3 ответа
Это:
(//my:Amend_Data)[last()]//my:Amend_Start_Date
должен сделать свое дело.
Без использования last()
ты можешь попробовать:
//my:Amend_Info_Repeater[0=count(following-sibling::my:Amend_Info_Repeater)]/my:Amend_Data/my:Amend_Start_Date
Используйте:
(//my:Amend_Start_Date)[last()]
Это выбирает последний (в порядке документа) из всех my:Amend_Start_Date
элементы в документе XML.
Обновление:
Если из-за некоторой ошибки / несоответствия в реализации XPath InfoPath вышеприведенное выражение не может быть успешно / правильно оценено, попробуйте:
//my:Amend_Start_Date
[not(preceding::my:Amend_Start_Date or ancestor::my:Amend_Start_Date)]
Я не получил это в одном xpath, но, возможно, xslt помогает.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-05-05T19:56:08">
<xsl:output method = "text" indent="yes"/>
<xsl:variable name="y" select="//my:Amend_Data"/>
<xsl:variable name="x" select="$y[count($y)]/my:Amend_Start_Date"/>
<xsl:template match="/">
<xsl:value-of select="$x"/>
</xsl:template>
</xsl:stylesheet>