嵌套for循环的XSLT
我是XSLT新手,面临着一个典型的问题。下面是问题的详细信息。我需要ItemB的结果(与ItemB的次数相同),其中属性BNum id与ANum id匹配,输出将是属性VAR1 id和ANum id的串联 循环对象是我面临的主要问题 输入示例:嵌套for循环的XSLT,xslt,xslt-1.0,xslt-2.0,Xslt,Xslt 1.0,Xslt 2.0,我是XSLT新手,面临着一个典型的问题。下面是问题的详细信息。我需要ItemB的结果(与ItemB的次数相同),其中属性BNum id与ANum id匹配,输出将是属性VAR1 id和ANum id的串联 循环对象是我面临的主要问题 输入示例: <?xml version="1.0" encoding="UTF-8"?> <myData> <ItemA> <VAR1 id="1234"> <ANum id = "3333"/&
<?xml version="1.0" encoding="UTF-8"?>
<myData>
<ItemA>
<VAR1 id="1234">
<ANum id = "3333"/>
<ANum id = "5555"/>
<ANum id = "6666"/>
</VAR1>
<VAR1 id="7B62">
<ANum id = "4444"/>
</VAR1>
</ItemA>
<ItemB>
<BNum id = "6666"/>
</ItemB>
<ItemB>
<BNum id = "4444"/>
</ItemB>
</myData>
期望输出:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<ItemC>
<CNum id = "1234-6666"/>
</ItemC>
<ItemC>
<CNum id = "7B62-4444"/>
</ItemC>
</result>
我尝试了以下代码-
<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<result>
<xsl:for-each select="myData/ItemB">
<ItemC>
<CNum>
<xsl:value-of select="BNum"/>
<xsl:if test="../ItemA/VAR1/ANum/@id = BNum/@id">
<xsl:attribute name="id">
<xsl:value-of select="concat(../ItemA/VAR1/@id,'-',BNum/@id)"/>
</xsl:attribute>
</xsl:if>
</CNum>
</ItemC>
</xsl:for-each>
</result>
</xsl:template>
</xsl:stylesheet>
我得到的结果是-
<?xml version="1.0" encoding="UTF-8"?>
<result>
<ItemC>
<CNum id = "1234-6666"/>
</ItemC>
<ItemC>
<CNum id = "1234-4444"/>
</ItemC>
</result>
ItemC的最后一个值错误,需要帮助更正。交叉引用最好使用。那么问题就变得相当微不足道了: XSLT1.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:key name="v1" match="VAR1" use="ANum/@id" />
<xsl:template match="/myData">
<result>
<xsl:for-each select="ItemB/BNum">
<ItemC>
<CNum id="{key('v1', @id)/@id}-{@id}"/>
</ItemC>
</xsl:for-each>
</result>
</xsl:template>
</xsl:stylesheet>
注意:要理解这一点,您可能还需要了解。交叉引用最好使用。那么问题就变得相当微不足道了: XSLT1.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:key name="v1" match="VAR1" use="ANum/@id" />
<xsl:template match="/myData">
<result>
<xsl:for-each select="ItemB/BNum">
<ItemC>
<CNum id="{key('v1', @id)/@id}-{@id}"/>
</ItemC>
</xsl:for-each>
</result>
</xsl:template>
</xsl:stylesheet>
注意:要理解这一点,您可能还需要了解。1。请将您的输入和问题中的预期输出作为代码(而不是图片)发布2.向我们展示您所尝试的,这样我们就可以修复它,而不必为您编写代码。-3.请选择XSLT 1.0或2.0—不要两者都选。你好,Micheal,非常感谢您的帮助。根据这个问题,我需要ItemC的数量应该等于ItemB的数量。你能帮忙吗?我下面的样式表将为给定输入中的每个
ItemB
创建一个ItemC
。所以我不明白你现在的问题是什么。你在编辑的文章中显示的输出不是执行转换后收到的输出:请忽略最后的编辑。我这边有个问题。我真的很感谢你的帮助。请将您的输入和问题中的预期输出作为代码(而不是图片)发布2.向我们展示您所尝试的,这样我们就可以修复它,而不必为您编写代码。-3.请选择XSLT 1.0或2.0—不要两者都选。你好,Micheal,非常感谢您的帮助。根据这个问题,我需要ItemC的数量应该等于ItemB的数量。你能帮忙吗?我下面的样式表将为给定输入中的每个ItemB
创建一个ItemC
。所以我不明白你现在的问题是什么。你在编辑的文章中显示的输出不是执行转换后收到的输出:请忽略最后的编辑。我这边有个问题。我真的很感谢你的帮助。