新信息: 修改我的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>
答案 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>