переменная внутри секунды для цикла

#xslt

#xslt

Вопрос:

Я пытаюсь напечатать значение переменной во второй для цикла xslt, но не отображается вот мой код

 <xsl:for-each select="CampaignData/Mailer/CustomerInfo/CustInfFld/Coupons/Cust_Sel_Coupons">
                <xsl:sort select="@CouponPosition"/>
                    <xsl:variable name="CouponID">
                        <xsl:value-of select="@CouponID"/>
                    </xsl:variable>

                        <xsl:for-each select="CampaignData/Mailer/Coupons/Cntr_Sel_Coupons">
                        <div style='color:red;'><xsl:value-of select='$CouponID'/></div>

                </xsl:for-each>
            </xsl:for-each>
  

Комментарии:

1. Где определен этот $CouponID? Сам по себе этот код ничего не говорит.

Ответ №1:

Я думаю, что одна из потенциальных проблем заключается в том, что внешний for-each изменяет контекстный узел, поэтому внутренний for-each должен учитывать это:

 <xsl:for-each select="CampaignData/Mailer/CustomerInfo/CustInfFld/Coupons/Cust_Sel_Coupons">
    <xsl:sort select="@CouponPosition"/>
    <xsl:variable name="CouponID" select="@CouponID"/>
    <xsl:for-each select="ancestor::CampaignData/Mailer/Coupons/Cntr_Sel_Coupons">
        <div style='color:red;'><xsl:value-of select='$CouponID'/></div>
    </xsl:for-each>
</xsl:for-each>
  

Я также изменил код для переменной, чтобы просто записать выражение, которое вы хотите выбрать, в атрибут select вместо вложения a value-of .

Если у вас все еще есть проблемы, опубликуйте образец XML, который вы хотите обработать.

Ответ №2:

select Атрибут вложенного xsl:for-each ничего не выбирает, и именно поэтому его тело не выполняется ни разу.

Внутри внутреннего xsl:for-each ваш текущий узел имеет вид:

 CampaignData/Mailer/CustomerInfo/CustInfFld/Coupons/Cust_Sel_Coupons
  

Атрибут select внутреннего xsl:for-each указывает:

 CampaignData/Mailer/Coupons/Cntr_Sel_Coupons
  

это относительное выражение XPath, и оно разрешается с текущего узла. Таким образом, указанное select для внутреннего xsl:for-each на самом деле (снаружи внешнего xsl:for-each ):

 CampaignData/Mailer/CustomerInfo/CustInfFld/Coupons/Cust_Sel_Coupons
                                /CampaignData/Mailer/Coupons/Cntr_Sel_Coupons
  

Маловероятно, что в исходном XML-документе есть какие-либо такие узлы, которые вы не показали.

Без исходного XML невозможно сказать, каким именно должно быть относительное выражение — скорее всего:

Изменить:

 <xsl:for-each select=
     "CampaignData/Mailer/Coupons/Cntr_Sel_Coupons"> 
  

Для:

 <xsl:for-each select=
     "../../../../Coupons/Cntr_Sel_Coupons">