在XSLT中获取父元素

时间:2012-10-02 07:17:29

标签: xml xslt xpath

我有这样的XML:

<PurchaseOrder>
    <ID>1</ID>
    <PurchaseOrderLine>
        <DATA>100<DATA>
    </PurchaseOrderLine>
    <PurchaseOrderLine>
        <DATA>200<DATA>
    </PurchaseOrderLine>
    <PurchaseOrderLine>
        <DATA>300<DATA>
    </PurchaseOrderLine>
</PurchaseOrder>
<PurchaseOrder>
    <ID>2</ID>
    <PurchaseOrderLine>
        <DATA>100<DATA>
    </PurchaseOrderLine>
    <PurchaseOrderLine>
        <DATA>200<DATA>
    </PurchaseOrderLine>
    <PurchaseOrderLine>
        <DATA>300<DATA>
    </PurchaseOrderLine>
</PurchaseOrder>
<PurchaseOrder>
    <ID>3</ID>
    <PurchaseOrderLine>
        <DATA>100<DATA>
    </PurchaseOrderLine>
    <PurchaseOrderLine>
        <DATA>200<DATA>
    </PurchaseOrderLine>
    <PurchaseOrderLine>
        <DATA>300<DATA>
    </PurchaseOrderLine>
</PurchaseOrder>

和XSL:

<xsl:template match="PurchaseOrder">
    <xsl:apply-templates select="PurchaseOrderLine"/>
</xsl:template>

<xsl:template match="PurchaseOrderLine">
    <!-- I want to get the PurchaseOrder\ID here for the current PurchaseOrder -->
</xsl:template>

如何在PurchaseOrderLine中获取当前父元素值(PurchaseOrder \ ID)?

3 个答案:

答案 0 :(得分:11)

如果您希望模板是原子的(隔离且可重用),则应该以这种方式引用父节点。相反,在调用模板时,传入您希望能够使用的引用。这样,您可以将此模板用于相同类型的节点,即使它具有不同的上下文/父节点(只要您仍然可以加载参数)。

<xsl:template match="PurchaseOrder">
    <xsl:apply-templates select="PurchaseOrderLine">
        <xsl:with-param name="PurchaseOrder" select="."/>
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="PurchaseOrderLine">
    <xsl:param name="PurchaseOrder"/>
    <!-- I want to get the PurchaseOrder\ID here for the current PurchaseOrder -->
</xsl:template>

现在,在您的PurchaseOrderLine模板中,您可以引用$ PurchaseOrder变量。

答案 1 :(得分:3)

好像你在XPath上跳过了一些基本的阅读。

<xsl:template match="PurchaseOrderLine">
    <xsl:value-of select="../ID" />
</xsl:template>

答案 2 :(得分:0)

不确定这是您要去的地方,但是可以通过执行以下操作来匹配“父”节点,这将检查父节点是否具有“子”节点。

<xsl:template match="//*[PurchaseOrderLine]>
    <!--- Do you stuff here with parent context--->
</xsl:template>

您可以执行以下操作,选择具有ID和数据值的PurchaseOrderLine。

<xsl:template match="//PurchaseOrder[ID=3 and PurchaseOrderLine/DATA=100]">
     <!--- Do stuff with parent that has the ID of 3 And the DATA of 200 --->
</xsl:template>