xml - 根据 XSLT 1.0 中的计数器值重复记录 n 次
问题描述
以下是输入消息
<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,字段“Number”具有恒定值“9”
示例:如果 MaxCounter 为 6,则需要在输出中重复 N1LoopRecord >6 次,如果 MaxCounter 值为零,则不应创建 N1Loop问题 :
我试图隔离这个问题并创建一个单独的 xslt 来测试并且无法在我自己的 xslt 中执行,下面是我尝试使用的链接,但我仍然无法解决这个问题。
感谢是否有人可以帮助我解决这个问题
解决方案
您可以通过使用从 0 倒计时的递归模板来解决此问题MaxCount
(此处,模板名为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>
输出如所愿。
推荐阅读
- c++ - 地图,C++中的矢量
- image - 在移动应用程序中自动压缩图像
- javascript - 如何在反应中获取具有输入值的div的innerText?
- python - Python:如何在当前光标位置上方打印 n 行(当前行上方)
- kubernetes - 如何使用 helm 检查所需数量的 pod 是否已启动并在 init 容器中处于活动状态
- python - 我如何才能删除列表中的第一次出现?
- svn - (乌龟) SVN Merge from foreign repository 不兼容mergeinfo修改
- oracle-cloud-infrastructure - 使用 oci-java-sdk 获取存储桶或对象的 URL
- python - discord python(带有int检查的bot.command)
- paypal - 贝宝加:REQUIRED_SCOPE_MISSING