如何显示可以在不同xpath中的CommercialVehicleFlag?

时间:2015-06-01 16:40:36

标签: xml xslt

新信息: 修改我的xsl如下, 修改后的xsl代码。

<nc:VehicleCMVIndicator>
<xsl:for-each select="//Vehicle[CommercialVehicleFlag]">
    <xsl:value-of select="CommercialVehicleFlag"/>
</xsl:for-each>

我得到2个CommercialVehicleFlag,这是错误的。

当前输出错误。

<nc:VehicleCMVIndicator>falsefalse</nc:VehicleCMVIndicator>

期望的输出。

<nc:VehicleCMVIndicator>false</nc:VehicleCMVIndicator>

我正在尝试从xml文档中显示 CommercialVehicleFlag 。 我的xsl正在处理一个xml文档而不是另一个。这是因为 CommercialVehicleFlag 可以在xml文档中的费用下或 Citation 下。但是它不能在同一个xml文档中的两个节点中。 我粘贴的示例xml显示了来自两个不同xml文档的 CommercialVehicleFlag 。 一个在费用下,另一个在引用下。 我的xsl仅适用于此xpath /Integration/Case/Charge/Vehicle/VehicleLicensePlateNumber中的 VehicleLicensePlateNumber ,并且此xpath /Integration/Citation/Vehicle/CommercialVehicleFlag失败。

在我的xsl中,我需要检查两个路径。我该怎么做呢?

带有CommercialVehicleFlag的xml文档,收费

<Integration xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:tsg="http://tsgweb.com" xmlns:IXML="http://tsgweb.com" xmlns:CMCodeQueryHelper="urn:CMCodeQueryHelper" PackageID="DL Notice to DVS" MessageID="67084884" xmlns="">
    <Case Op="E" InternalID="1617090736" ID="12125870" xmlns:user="http://tylertechnologies.com">
        <CaseNumber>55</CaseNumber>
        <Charge ID="10906336" PartyID="16770378" InternalChargeID="1616713996" InternalPartyID="1614673416" xmlns:reslib="urn:reslib">
            <ChargeOffenseDate>05/28/2015</ChargeOffenseDate>
            <Vehicle>
                <VehicleLicensePlateState>MM</VehicleLicensePlateState>
                <VehicleLicensePlateNumber>ASD123</VehicleLicensePlateNumber>
                <VehicleMake Word="JEEP">Jeep</VehicleMake>
                <CommercialVehicleFlag>false</CommercialVehicleFlag>
                <HazardousVehicleFlag>false</HazardousVehicleFlag>
            </Vehicle>
        </Charge>
    </Case>
</Integration>

在Citation

下使用CommercialVehicleFlag的xml文档
<Integration xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:tsg="http://tsgweb.com" xmlns:IXML="http://tsgweb.com" xmlns:CMCodeQueryHelper="urn:CMCodeQueryHelper" PackageID="DL Notice to DVS" MessageID="67086833" xmlns="">
    <Citation ID="5380737" xmlns:user="http://tylertechnologies.com">
        <CitationNumber>33</CitationNumber>
        <TicketDate>12/25/2014</TicketDate>
        <Vehicle>
            <CommercialVehicleFlag>false</CommercialVehicleFlag>
            <HazardousVehicleFlag>false</HazardousVehicleFlag>
        </Vehicle>
    </Citation>
</Integration>

我的xsl代码只在Charge下显示CommercialVehicleFlag而不在Citation下

<!--Template for ext:Charge-->
    <xsl:template name="Charge">
        <ext:Charge>
            <xsl:choose>
                <xsl:when test="(count(ChargeHistory[@Stage='Disposition Event']))>0">
                    <xsl:for-each select="ChargeHistory[@Stage='Disposition Event']">
                        <xsl:sort select="@DispositionEventSequence" data-type="number" order="descending"/>
                        <xsl:if test="position()=1">
                            <xsl:call-template name="ChargeDetails"/>
                        </xsl:if>
                    </xsl:for-each>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:for-each select="ChargeHistory[@Stage='Case Filing']">
                        <xsl:sort select="@FilingSequence" data-type="number" order="descending"/>
                        <xsl:if test="position()=1">
                            <xsl:call-template name="ChargeDetails"/>
                        </xsl:if>
                    </xsl:for-each>
                </xsl:otherwise>
            </xsl:choose>
        </ext:Charge>
    </xsl:template>



    <!--Charge Details Template-->
<xsl:template name="ChargeDetails">
    <j:ChargeSequenceID>
        <xsl:value-of select="ChargeNumber"/>
    </j:ChargeSequenceID>
    <j:ChargeStatute>
        <j:StatuteDescriptionText>
            <xsl:value-of select="Statute/StatuteCode"/>
        </j:StatuteDescriptionText>
        <j:StatuteText>
            <xsl:value-of select="Statute/StatuteCode/@Word"/>
        </j:StatuteText>
    </j:ChargeStatute>
    <j:ChargeSeverityDescriptionText>
        <xsl:value-of select="Statute/Degree"/>
    </j:ChargeSeverityDescriptionText>
        <ext:Citation>
            <nc:ActivityDate>
                <xsl:for-each select="/Integration/Citation/CitationCharge[ChargeID=current()/../@ID]">
                    <nc:Date>
                        <xsl:value-of select="mscef:formatDate(string(../TicketDate))"/>
                    </nc:Date>
                </xsl:for-each>
            </nc:ActivityDate>
            <nc:Identification>
                <nc:IdentificationID>
                    <xsl:value-of select="/Integration/Citation/CitationNumber"/>
                </nc:IdentificationID>
                <nc:IdentificationJurisdiction>
                    <nc:JurisdictionText>
                        <xsl:value-of select="/Integration/Citation/Agency/@Word"/>
                    </nc:JurisdictionText>
                </nc:IdentificationJurisdiction>
            </nc:Identification>
        </ext:Citation>
        <ext:Vehicle>
            <nc:VehicleCMVIndicator>
            <xsl:for-each select="/Integration/Citation/Vehicle[CommercialVehicleFlag]">
                <xsl:for-each select="//Case/Charge/Vehicle[CommercialVehicleFlag]">
                <xsl:value-of select="../Vehicle/CommercialVehicleFlag"/>
                </xsl:for-each>
            </xsl:for-each>
            </nc:VehicleCMVIndicator>
        </ext:Vehicle>
</xsl:template>

1 个答案:

答案 0 :(得分:0)

您的XSLT目前使用嵌套的xsl:for-each

<xsl:for-each select="/Integration/Citation/Vehicle[CommercialVehicleFlag]">
    <xsl:for-each select="//Case/Charge/Vehicle[CommercialVehicleFlag]">

但是在你的情况下,这永远不会返回任何东西。如果CommercialVehicleFlag位于Charge之下,则第一个xsl:for-each将不会选择任何节点,因此第二个xsl:for-each将不适用。

另一方面,如果第一个xsl:for-each确实选择了某个内容,那么根据您的逻辑,CommercialVehicleFlag将不在Charge之下,因此第二个xsl:for-each不会退货。

你可以做的是使用union运算符|将两个表达式合并为一个。如果CommercialVehicleFlag确实只能在一个地方出现,那么这将返回相关节点。

<xsl:for-each select="/Integration/Citation/Vehicle[CommercialVehicleFlag]|//Case/Charge/Vehicle[CommercialVehicleFlag]">

请注意,如果您的XML中只有一个Vehicle节点,您实际上可以将其简化为此

<xsl:value-of select="//Vehicle[CommercialVehicleFlag]/CommercialVehicleFlag"/>

然后它何时出现并不重要。它会在XML中的任何位置选择它。

编辑:如果您的XML中有多个Charge元素,看起来您只想要相对于您所在节点的那个元素,那么您可以尝试这样的事情:

<nc:VehicleCMVIndicator>
   <xsl:value-of select="/Integration/Citation/Vehicle[CommercialVehicleFlag]|../Vehicle/CommercialVehicleFlag"/>
</nc:VehicleCMVIndicator>

或许只是这样做......

<nc:VehicleCMVIndicator>
   <xsl:value-of select="../Vehicle/CommercialVehicleFlag"/>
</nc:VehicleCMVIndicator>