【问题标题】:XSLT for each list value for specified id指定 id 的每个列表值的 XSLT
【发布时间】:2017-03-12 02:32:38
【问题描述】:

我尝试在深层参数中列出值,但只指定参数。 我为 706 号的每个测试 id 执行此操作,当我为每个测试 ID 执行并列出值名称时。我需要在值之间使用太多分号,但不是在开头和结尾。

XML:

 <parameters>
<section id="27" name="Parametry produktu"/>
<parameter id="23" name="kolor">
  <value id="42" name="jasny róż"/>
</parameter>
<parameter id="25" name="skład">
  <value id="43" name="97% bawełna, 3% poliamid"/>
</parameter>
<parameter id="706" name="rozmiar (ukryć)"">
  <value id="717" name="46"/>
  <value id="718" name="47"/>
  <value id="719" name="48"/>
</parameter>
<parameter id="142" name="płeć (ukryć)">
  <value id="746" name="ona"/>
</parameter>
</parameters>

XSLT:

             <sizes3>
          <xsl:for-each select="parameters">
           <xsl:if test="parameter/@id = 706">
            <xsl:for-each select="parameter">
              <xsl:choose>
               <xsl:when test="position() = 1"> 
                <xsl:value-of select="value/@name" />
               </xsl:when>
               <xsl:otherwise>
                <xsl:value-of select="concat('; ', value/@name)" />                 
               </xsl:otherwise>
              </xsl:choose>
            </xsl:for-each>                                     
           </xsl:if>
          </xsl:for-each>             
         </sizes3>

结果是:

<sizes3>jasny róż; 97% bawełna, 3% poliamid;46; ona;</sizes3>

但我需要:

<sizes3>46;47;48</sizes3>

【问题讨论】:

    标签: for-loop xslt each


    【解决方案1】:

    这是一种方法:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="/parameters">
        <!-- other stuff ? -->
        <sizes3>
            <xsl:for-each select="parameter[@id=706]/value">
                <xsl:value-of select="@name" /> 
                <xsl:if test="position()!=last()">
                    <xsl:text>;</xsl:text>
                </xsl:if>
            </xsl:for-each> 
        </sizes3>
        <!-- more stuff ? -->
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

      【解决方案2】:

      更简单、更短、没有 &lt;xsl:for-each&gt;、没有 XSLT 条件运算符

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:strip-space elements="*"/>
      
        <xsl:template match="/">
          <size3><xsl:apply-templates/></size3>
        </xsl:template>
      
        <xsl:template match="parameter[@id=706]/value">
         <xsl:apply-templates select="@name"/>
        </xsl:template>
      
        <xsl:template match="parameter[@id=706]/value[position() > 1]" priority="2">
          <xsl:text>;</xsl:text><xsl:apply-templates select="@name"/>
        </xsl:template>
      </xsl:stylesheet>
      

      【讨论】:

        猜你喜欢
        • 2015-09-07
        • 1970-01-01
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多