XSLT Как получить предыдущее значение атрибута, если мое условие удовлетворено? - PullRequest
0 голосов
/ 09 августа 2011

XSLT Как получить предыдущее значение атрибута, если мое условие удовлетворено?

Я пытался получить желаемое, но безуспешно, может кто-нибудь помочь мне, как этого добиться?

Вотмой Zip.xml

<Zip>
        <ZipNotify Zip="1144" ZipNo="1" ZipTime="2010-09-02T11:15:30+10:00"/>
        <ZipDetail Zone="U" DepartZip="West" ArriveZip="West"/>
        <ZipCategoryDetail ZORE="false" />
        <ZipOrigin ZipOrigin="ABC002" Die="20:59:00"/>
        <ZipDestination ZipDestination="UVW001" Live="21:38:00"/>
        <ZipPath>
            <ZipSubject ZipSubjectType="Payed" ZipNum="1">
                <ZipRoute ZipLoc="ABC002" ZipStop="true" ZipDieTime="20:59:00" ZipDieTime1="20:59:00"/>
            </ZipSubject>
            <ZipSubject ZipSubjectType="Payed" ZipNum="2">
                <ZipRoute ZipLoc="BCD002" ZipStop="true" ZipLiveTime="21:00:40" ZipDieTime1="21:01:00"/>
                <ZipSpec Charge="false"/>
            </ZipSubject>
            <ZipSubject ZipSubjectType="Payed" ZipNum="3">
                <ZipRoute ZipLoc="CDE001" ZipStop="true" ZipLiveTime="21:03:40" ZipDieTime1="21:04:00"/>
                <ZipSpec Charge="true"/>
            </ZipSubject>
            <ZipSubject ZipSubjectType="Payed" ZipNum="4">
                <ZipRoute ZipLoc="DEF001" ZipStop="true" ZipLiveTime="21:05:40" ZipDieTime1="21:06:00"/>
                <ZipSpec Charge="true"/>
            </ZipSubject>
            <ZipSubject ZipSubjectType="Payed" ZipNum="5">
                <ZipRoute ZipLoc="EFG001" ZipStop="true" ZipLiveTime="21:07:40" ZipDieTime1="21:08:00"/>
                <ZipSpec Charge="true"/>
            </ZipSubject>
            <ZipSubject ZipSubjectType="Payed" ZipNum="5">
                <ZipRoute ZipLoc="UVW001" ZipStop="true" ZipLiveTime="21:38:00" ZipLiveTime1="21:38:00"/>
                <ZipSpec Charge="true"/>
            </ZipSubject>
        </ZipPath>
</Zip>

Вот мой XSL

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
    <html>
    <head/>
        <body>
            <xsl:for-each select="/Zip/ZipPath/ZipSubject">
                <xsl:if test="/Zip/ZipPath/ZipSubject/ZipSpec/@Charge = 'true'">
                    <div>ZipLoc: <xsl:value-of select="/Zip/ZipPath/ZipSubject/ZipRoute/@ZipLoc"/> </div>
                    <div>Charge: <xsl:value-of select="/Zip/ZipPath/ZipSubject/ZipSpec/@Charge"/></div>
                </xsl:if>

            </xsl:for-each>
        </body>
    </html>
    </xsl:template>
</xsl:stylesheet>

Out Put Я хочу, я хочу получить ZipLoc предыдущего ZipSubject, где Charge = "true", например.Для ZipNum = "3" значение Charge = "true", поэтому мой выход должен отображать предыдущий ZipLoc = "BCD002" (даже если Charge = "false" ZipNum = "2") и все, он не должен выполнять дополнительную проверку для ZipOrigin идля ZipDestination снова следует проверить из последнего ZipNum = "5", если Charge = "true", то просто следует использовать тот же ZipLoc = "UVW001"

Желаемый вывод должен быть

BCD002UVW001

Но мой вывод ниже.Я испробовал возможные способы (я знаю, что у него нет опыта работы с XSLT, что не является оправданием), пожалуйста, помогите мне получить желаемый результат

ZipLoc: ABC002
Charge: false
ZipLoc: ABC002
Charge: false
ZipLoc: ABC002
Charge: false
ZipLoc: ABC002
Charge: false
ZipLoc: ABC002
Charge: false
ZipLoc: ABC002
Charge: false

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Я хочу получить ZipLoc предыдущего ZipSubject, где Charge = "true"

Внутри контекста xsl:for-each вы можете использовать следующий XPath:

 "preceding-sibling::ZipSubject[1]/ZipRoute/@ZipLoc"

Например, следующий фрагмент XSLT показывает, как печатать ZipLog и Charge предыдущего узла только для тех, у которых Charge = 'true':

<xsl:for-each select="/Zip/ZipPath/ZipSubject[ZipSpec/@Charge = 'true']">
  <div>ZipLoc: <xsl:value-of 
       select="preceding-sibling::ZipSubject[1]/ZipRoute/@ZipLoc"/> 
  </div>
  <div>Charge: <xsl:value-of 
       select="preceding-sibling::ZipSubject[1]/ZipSpec/@Charge"/></div>
</xsl:for-each>
0 голосов
/ 09 августа 2011

Похоже, вы выполняете больше работы, чем вам нужно.Приведенный ниже xPath должен предоставить вам ZipLoc для первого упомянутого вами случая.

/Zip/ZipPath/ZipSubject[@ZipNum = '3' AND ZipSpec/@Charge = 'true']/ZipRoute/@ZipLoc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...