如何从具有相同名称的节点获取最后一个值

时间:2019-06-20 12:23:02

标签: xml xslt xslt-1.0

我有一个带有名为“ Value”的节点的xml,该节点位于xml中的多个位置。但是,我需要选择节点“名称= werkweeknummer”下的节点“值”。我已经尝试了多种方法,但是没有用。

<xsl:template match="/">
   <xsl:for-each select="/x:Invoice">
      <xsl:if test="cbc:IssueDate"><xsl:value-of select="concat(substring(cbc:IssueDate,1,4),'W',cac:InvoiceLine/cac:Item/cac:AdditionalItemProperty/cbc:Value)"/></xsl:if>
   </xsl:for-each>
</xsl:template> 

我用substring-lenghts(node name)-1)尝试了一下,但是没有得到最后2个字符->在我的情况下,这是我想要的结果,但是相反,它给出了12结果。

 <cac:InvoiceLine>
    <cbc:ID>121</cbc:ID>
    <cbc:InvoicedQuantity unitCode="C62">+1.00</cbc:InvoicedQuantity>
    <cbc:LineExtensionAmount currencyID="EUR">+64.30</cbc:LineExtensionAmount>
    <cac:DespatchLineReference>
      <cbc:LineID/>
      <cac:DocumentReference>
        <cbc:ID>101992936-0</cbc:ID>
      </cac:DocumentReference>
    </cac:DespatchLineReference>
    <cac:TaxTotal>
      <cbc:TaxAmount currencyID="EUR">+13.50</cbc:TaxAmount>
    </cac:TaxTotal>
    <cac:Item>
      <cbc:Name>Toeslag ADV percentage</cbc:Name>
      <cac:ClassifiedTaxCategory>
        <cbc:ID schemeID="UN/ECE 5305" schemeAgencyID="6">S</cbc:ID>
        <cbc:Percent>+21.00</cbc:Percent>
        <cac:TaxScheme>
          <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">VAT</cbc:ID>
        </cac:TaxScheme>
      </cac:ClassifiedTaxCategory>
      <cac:AdditionalItemProperty>
        <cbc:Name>geboortedatum</cbc:Name>
        <cbc:Value>1984-10-12</cbc:Value>
      </cac:AdditionalItemProperty>
      <cac:AdditionalItemProperty>
        <cbc:Name>Postcode Plaats</cbc:Name>
        <cbc:Value>1234 AA BLABLA</cbc:Value>
      </cac:AdditionalItemProperty>
      <cac:AdditionalItemProperty>
        <cbc:Name>werkweeknummer</cbc:Name>
        <cbc:Value>16</cbc:Value>
      </cac:AdditionalItemProperty>
    </cac:Item>

这是XML,其中提到的节点具有相同的名称(上面,节点名称=值)

<xsl:template match="/">
   <xsl:for-each select="/x:Invoice">
      <xsl:if test="cbc:IssueDate"><xsl:value-of select="concat(substring(cbc:IssueDate,1,4),'W',cac:AdditionalItemProperty/cbc:Value)"/></xsl:if>
   </xsl:for-each>
</xsl:template>

我现在将此作为我的代码,但结果是2019W1980-02-12。我想拥有2019W16(16是来自具有相同名称的最后一个节点的值,该值在“ werkweeknummer”下)。我尝试使用substring-length公式,但是结果为12-> 2019W12 ..

1 个答案:

答案 0 :(得分:0)

您正在使用的当前表达式; cac:InvoiceLine/cac:Item/cac:AdditionalItemProperty/cbc:Value;将返回三个节点。在XSLT 1.0中,您使用期望将字符串作为参数的函数(在这种情况下为concat),那么如果传入节点集,则它将仅使用第一个节点的字符串值。 (在XSLT 2.0中,您会出现错误)。

您想要的表情是这个...

cac:InvoiceLine/cac:Item/cac:AdditionalItemProperty[cbc:Name='werkweeknummer']/cbc:Value

请注意,您可以将当前模板简化为此。...

<xsl:template match="/">
  <xsl:for-each select="/x:Invoice[cbc:IssueDate]">
    <xsl:value-of select="concat(substring(cbc:IssueDate,1,4),'W',cac:InvoiceLine/cac:Item/cac:AdditionalItemProperty[cbc:Name='werkweeknummer']/cbc:Value)"/>
  </xsl:for-each>
</xsl:template>