如何在 XSLT 中选择属性值等于 current()/@value -1 的前一个兄弟?

问题描述 投票:0回答:1

我是 XSLT 的新手,尽管我进行了研究,但我很难找到解释或至少将它们应用到我的案例中,所以我在这里试试运气,并提前感谢您的关注

我有一个 XML 结构,其中每个元素(units/results)都有一个名为 packagingLevel 的属性。我需要找到当前节点的前一个同级节点,其中 packagingLevel 属性等于 current()/@packagingLevel -1,并在已有的转换中选择不同属性 (packagingType) 的值。因此,如果 packagingLevel = 5,我将搜索 packagingLevel = 4 的同级兄弟的 packagingType

这是我输入的示例:

<root>
    <header>
        <products>
            <results>
                <units>
                    <results>
                        <itemCode>001</itemCode>
                        <packagingType>BOX</packagingType>
                        <eanCode>0000000000001</eanCode>
                        <packagingLevel>1</packagingLevel>
                        <quantity>1</quantity>
                    </results>
                    <results>
                        <itemCode>002</itemCode>
                        <packagingType>PALETTE</packagingType>
                        <eanCode>0000000000002</eanCode>
                        <packagingLevel>2</packagingLevel>
                        <quantity>1</quantity>
                    </results>
                </units>
            </results>
        </products>
    </header>
</root>

这是我尝试过的示例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/">
        <xsl:for-each select="//products/results">
            <Element>
                <xsl:for-each select="units/results">
                    <UE>
                        <UE_EAN>
                            <xsl:value-of select="eanCode" />
                        </UE_EAN>
                        <TYPE_UE>
                            <xsl:choose>
                                <xsl:when test="packagingLevel = 1">A01</xsl:when>
                                <xsl:when test="packagingType = 'BOX'">B01</xsl:when>
                                <xsl:when test="packagingType = 'PALETTE'">P01</xsl:when>
                            </xsl:choose>
                        </TYPE_UE>

                        <TYPE_UE_CONTENT>
                            <xsl:choose>
                                <xsl:when test="packagingLevel = 1">A01</xsl:when>
                                <xsl:otherwise>
                                    <xsl:variable name="prevLevel" select="preceding-sibling::unite[packagingLevel = current()/packagingLevel - 1]/TYPE_UE" />
                                    <xsl:value-of select="$prevLevel"/>
                                </xsl:otherwise>
                            </xsl:choose>
                        </TYPE_UE_CONTENT>

                        <UE_QTE>
                            <xsl:value-of select="quantite" />
                        </UE_QTE>
                    </UE>
                </xsl:for-each>
            </Element>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

这是当前输出:

<Element>
    <... />
    <... />
    <UE>
        <UE_EAN>0000000000001</UE_EAN>
        <TYPE_UE>A01</TYPE_UE>
        <TYPE_UE_CONTENT>A01</TYPE_UE_CONTENT>
        <UE_QTY>1</UE_QTY>
    </UE>
    <UE>
        <UE_EAN>0000000000002</UE_EAN>
        <TYPE_UE>P01</TYPE_UE>
        <TYPE_UE_CONTENT />
        <UE_QTE>2</UE_QTE>
    </UE>
    <... />
</Element>

这是基于上面示例的预期输出:

<Element>
    <... />
    <... />
    <UE>
        <UE_EAN>0000000000001</UE_EAN>
        <TYPE_UE>A01</TYPE_UE>
        <TYPE_UE_CONTENT>A01</TYPE_UE_CONTENT>
        <UE_QTY>1</UE_QTY>
    </UE>
    <UE>
        <UE_EAN>0000000000002</UE_EAN>
        <TYPE_UE>P01</TYPE_UE>
        <TYPE_UE_CONTENT>A01</TYPE_UE_CONTENT>
        <UE_QTE>2</UE_QTE>
    </UE>
    <... />
</Element>

非常感谢您阅读我的文章以及您可以为我提供的任何帮助或解释!

xml xslt apache-nifi
1个回答
0
投票

您使用

preceding-sibling
的位置的上下文节点是一个
results
元素,并且
results
元素的所有兄弟元素也被命名为
results
,因此您需要
preceding-sibling::results
或简称为
preceding-sibling::*

我不知道你的表达式中的

/TYPE_UE
是做什么用的——你的输入中似乎没有任何 TYPE_UE 元素。

© www.soinside.com 2019 - 2024. All rights reserved.