我有一个带有名为“ 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 ..
答案 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>