我是 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>
非常感谢您阅读我的文章以及您可以为我提供的任何帮助或解释!
您使用
preceding-sibling
的位置的上下文节点是一个 results
元素,并且 results
元素的所有兄弟元素也被命名为 results
,因此您需要 preceding-sibling::results
或简称为 preceding-sibling::*
。
我不知道你的表达式中的
/TYPE_UE
是做什么用的——你的输入中似乎没有任何 TYPE_UE 元素。