【问题标题】:Repeat a Record ntimes Based on the counter Value in XSLT 1.0 [duplicate]根据 XSLT 1.0 中的计数器值重复记录 n 次 [重复]
【发布时间】:2019-02-25 00:16:10
【问题描述】:

以下是输入信息

<ns0:Root xmlns:ns0="LoopInput">
  <MaxCount>6</MaxCount>
  <Detail>
    <Member>
      <CompanyName>XYZ</CompanyName>
      <PersonName>John</PersonName>
      <State>KS</State>
      <Country>USA</Country>
      <Amount>1000</Amount>
      <CombinedState>Yes</CombinedState>
    </Member>
    <Member>
      <CompanyName>ABC</CompanyName>
      <PersonName>Larry</PersonName>
      <State>IL</State>
      <Country>USA</Country>
      <Amount>1000</Amount>
      <CombinedState>No</CombinedState>
    </Member>
  </Detail>
</ns0:Root>

输出需要看起来像:

<ns0:Root xmlns:ns0="LoopOutput">
  <Detail>

    <Member>
      <CompanyName>XYZ</CompanyName>
      <PersonName>John</PersonName>
      <State>KS</State>
      <Country>USA</Country>
      <Amount>1000</Amount>
      <CombinedState>Yes</CombinedState>
    </Member>
    <Member>
      <CompanyName>ABC</CompanyName>
      <PersonName>Larry</PersonName>
      <State>IL</State>
      <Country>USA</Country>
      <Amount>1000</Amount>
      <CombinedState>No</CombinedState>
    </Member>
  </Detail>
  <NLoop>
    <Number>9</Number>
  </NLoop>
  <NLoop>
    <Number>9</Number>
  </NLoop>
  <NLoop>
    <Number>9</Number>
  </NLoop>
  <NLoop>
    <Number>9</Number>
  </NLoop>
  <NLoop>
    <Number>9</Number>
  </NLoop>
  <NLoop>
    <Number>9</Number>
  </NLoop>
</ns0:Root>

已尝试 XSLT 1.0

<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var s0" version="1.0" xmlns:s0="LoopInput" xmlns:ns0="LoopOutput">
  <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
  <xsl:template match="/">
    <xsl:apply-templates select="/s0:Root" />
  </xsl:template>
  <xsl:template match="/s0:Root">
    <ns0:Root>
      <Detail>
        <xsl:for-each select="Detail/Member">
          <Member>
            <CompanyName>
              <xsl:value-of select="CompanyName/text()" />
            </CompanyName>
            <PersonName>
              <xsl:value-of select="PersonName/text()" />
            </PersonName>
            <State>
              <xsl:value-of select="State/text()" />
            </State>
            <Country>
              <xsl:value-of select="Country/text()" />
            </Country>
            <Amount>
              <xsl:value-of select="Amount/text()" />
            </Amount>
            <CombinedState>
              <xsl:value-of select="CombinedState/text()" />
            </CombinedState>
          </Member>
        </xsl:for-each>
      </Detail>
    </ns0:Root>
  </xsl:template>
</xsl:stylesheet>

要求:

基于 MaxCounter 字段,需要重复 NLoop Record 与 字段“数字”具有恒定值“9”
示例:如果 MaxCounter 为 6,则需要在输出中重复 N1LoopRecord >6 次,如果 MaxCounter 值为零,则不应创建 N1Loop

问题:

我试图隔离这个问题并创建一个单独的 xslt 来测试和 在我自己的 xslt 中无法做到,下面是我尝试使用的链接,但是 我仍然无法解决这个问题。

Duplicate Element x number of times with XSLT

如果有人能帮我解决这个问题,我很感激

【问题讨论】:

标签: xml xslt


【解决方案1】:

您可以通过使用从 MaxCount 倒数到 0 的递归模板来解决这个问题(这里,模板被命名为 loop)。根据您的特定需求调整此骨架。

<xsl:template name="loop">
    <xsl:param name="cnt" />
    <xsl:if test="$cnt > 0">
      <NLoop>
        <Number>9</Number>
      </NLoop>      
      <xsl:call-template name="loop">
        <xsl:with-param name="cnt" select="$cnt - 1" />
      </xsl:call-template>
    </xsl:if>  
</xsl:template>

然后在你的主模板末尾调用这个模板:

<xsl:template match="/s0:Root">
    <ns0:Root>
      <Detail>
        <xsl:for-each select="Detail/Member">
          <Member>
            <CompanyName>
              <xsl:value-of select="CompanyName/text()" />
            </CompanyName>
            <PersonName>
              <xsl:value-of select="PersonName/text()" />
            </PersonName>
            <State>
              <xsl:value-of select="State/text()" />
            </State>
            <Country>
              <xsl:value-of select="Country/text()" />
            </Country>
            <Amount>
              <xsl:value-of select="Amount/text()" />
            </Amount>
            <CombinedState>
              <xsl:value-of select="CombinedState/text()" />
            </CombinedState>
          </Member>
        </xsl:for-each>
      </Detail>
      <!-- Call the 'loop' template -->
      <xsl:call-template name="loop">
        <xsl:with-param name="cnt" select="MaxCount" />
      </xsl:call-template>
    </ns0:Root>
</xsl:template>

输出如你所愿。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多