【问题标题】:XSLT: Concatenation of looping list items separated by pipe symbolXSLT:连接由管道符号分隔的循环列表项
【发布时间】:2018-12-28 23:57:41
【问题描述】:

我正在尝试使用 XSLT 模板构建 XML 输出 XML 有多个 Group GroupName="PersonalSocialMedia" 项目,其中每个项目都有多个组项目。

我的输入 XML 如下所示:

<FormData>     
     <Group GroupName="PersonalSocialMedia" Array="true">
            <GroupItem>
              <Element Name="itemID">2</Element>
              <Element Name="NomineePersonalSocialMedia">
                <Code>2</Code>
                <Value>Instagram</Value>
              </Element>
              <Element Name="NomineeSocialMediaUserName">Iuname</Element>
            </GroupItem>
            <GroupItem>
              <Element Name="itemID">1</Element>
              <Element Name="NomineePersonalSocialMedia">
                <Code>1</Code>
                <Value>Facebook</Value>
                </Element>
              <Element Name="NomineeSocialMediaUserName">fname</Element>
            </GroupItem>
          </Group>
          <Group GroupName="PersonalSocialMedia" Array="true">
            <GroupItem>
              <Element Name="itemID">3</Element>
              <Element Name="NomineePersonalSocialMedia">
                <Code>3</Code>
                <Value>LinkedIn</Value>
              </Element>
              <Element Name="NomineeSocialMediaUserName">testname1</Element>
            </GroupItem>
            <GroupItem>
              <Element Name="itemID">2</Element>
              <Element Name="NomineePersonalSocialMedia">
                <Code>4</Code>
                <Value>Twitter</Value>
         </Element>
              <Element Name="NomineeSocialMediaUserName">testname2</Element>
        </GroupItem>
        <GroupItem>
            <Element Name="itemID">1</Element>
            <Element Name="NomineePersonalSocialMedia">
                <Code>1</Code>
                <Value>Facebook</Value>
            </Element>
            <Element Name="NomineeSocialMediaUserName">testname3</Element>
        </GroupItem>
    </Group>
</FormData> 

我想将生成的 XML 构建成如下所示;即组合每个 Groupitem 下的元素名称“NomineePersonalSocialMedia”内的所有 Value 节点,用逗号分隔,然后再次将这些值与根节点 Groupname="PersonalSocialMedia" 下的项目组合,用管道符号分隔。但是有些多级模板没有按预期工作

<PersonalSocialMedia>
   Instagram, Facebook | LinkedIn, Twitter, Facebook
</PersonalSocialMedia> 

这是我为实现所需输出而应用的 XSLT

<PersonalSocialMedia>
    <xsl:attribute name="Category">Nominee''s preferred personal social media network</xsl:attribute>
        <xsl:call-template name="Append">
            <xsl:with-param name="List" select="Group[@GroupName=''Nominees'']/GroupItem/Element[@Name=''PersonalSocialMedia'']/Value" />
        </xsl:call-template>
    </xsl:if>
    <xsl:for-each select="Group[@GroupName=''Nominees'']/GroupItem/Group[@GroupName=''PersonalSocialMedia'']/GroupItem">
        <xsl:call-template name="SocialMediaAppend">
            <xsl:with-param name="List" select="Element[@Name=''NomineePersonalSocialMedia'']/Value" />
        </xsl:call-template>
    </xsl:for-each>
    <xsl:call-template name="SocialMediaAppend">
        <xsl:with-param name="List" select="Group[@GroupName=''PersonalSocialMedia'']/GroupItem" />
    </xsl:call-template>
</PersonalSocialMedia>

模板:

这是被调用来构建所需结果集的模板。

<xsl:template name="SocialMediaAppend">
    <xsl:param name="List" />
    <xsl:for-each select="$List">
        <xsl:if test="position()!=last()"> | </xsl:if>
    </xsl:for-each>
</xsl:template>

现在模板返回错误的结果集。我可以使用单个组项生成预期的结果集,但是当有多个时它返回错误的结果。

【问题讨论】:

    标签: xml xslt string-concatenation templating


    【解决方案1】:

    使用 XSLT 1.0 版修复您的代码示例,您可以应用以下模板(我将未知代码替换为 ...):

    <xsl:template match="/FormData">
      <PersonalSocialMedia>
        ...
        <xsl:for-each select="Group[@GroupName='PersonalSocialMedia']">
            <xsl:call-template name="SocialMediaAppend">         <!-- Call with all 'Value's -->
                <xsl:with-param name="List" select="GroupItem/Element[@Name='NomineePersonalSocialMedia']/Value" />
            </xsl:call-template>
            <xsl:if test="position()!=last()"> | </xsl:if>       <!-- Delimiter between 'Group's --> 
        </xsl:for-each>
      </PersonalSocialMedia>
    </xsl:template>
    
    <xsl:template name="SocialMediaAppend">
        <xsl:param name="List" />
        <xsl:for-each select="$List">
            <xsl:value-of select="." /> 
            <xsl:if test="position()!=last()">, </xsl:if>        <!-- Delimiter between 'Value's -->
        </xsl:for-each>
    </xsl:template>
    

    将这些模板应用于 XML 会产生以下结果:

    <PersonalSocialMedia>Instagram, Facebook | LinkedIn, Twitter, Facebook</PersonalSocialMedia>
    

    您可以通过省略命名模板来简化此操作。所以模板可能看起来像:

    <xsl:template match="/FormData">
      <PersonalSocialMedia>
        <xsl:for-each select="Group[@GroupName='PersonalSocialMedia']">
          <xsl:for-each select="GroupItem/Element[@Name='NomineePersonalSocialMedia']/Value">
            <xsl:value-of select="." />
            <xsl:if test="position()!=last()">, </xsl:if>
          </xsl:for-each>
          <xsl:if test="position()!=last()"> | </xsl:if>
        </xsl:for-each>
      </PersonalSocialMedia>
    </xsl:template>
    

    结果保持不变。我无法估计这是否会改进您的代码,因此请将其视为一个建议。

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      相关资源
      最近更新 更多