Как я могу получить последнее значение от узла с тем же именем - PullRequest
0 голосов
/ 20 июня 2019

У меня есть 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 (имя узла) - 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"). Я попытался использовать формулу длины подстроки, но затем она дает 12 в результате -> 2019W12 ..

1 Ответ

0 голосов
/ 20 июня 2019

Текущее выражение, которое вы используете; 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>
...