Вернуть "последний" узел в наборе повторяющихся узлов

Мне нужно адаптировать следующее выражение 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>
Другие вопросы по тегам