问题:我在两个不同的地方拥有属性。我想在输出中只使用其中一个位置。所以我必须将(?)相应的Attribute / ID映射到ElementAttributeID。
这是我想要转换的XML:
<ID>Testdata</ID>
<Attributes>
<Attribute>
<ID>Time</ID>
<Name>Time</Name>
</Attribute>
<Attribute>
<ID>Place</ID>
<Name>Place</Name>
</Attribute>
<Attribute>
<ID>Sense</ID>
<Name>Sense</Name>
</Attribute>
</Attributes>
<Elements>
<Element>
<ID>First</ID>
<Name>First</Name>
<MGs>
<MG>
<Attributes>
<Attribute>
<ElementAttributeID>Time</ElementAttributeID>
</Attribute>
<Attribute>
<ElementAttributeID>Place</ElementAttributeID>
</Attribute>
</Attributes>
</MG>
</MGs>
</Element>
</Elements>
我设法编写了这个宇宙的XSL片段
<xsl:template match="MGs/MG/Attributes/Attribute">
<xsl:for-each select=".">
<xsl:if test="./node() = parent::Attributes/Attribute">
<xsl:value-of select="concat(CubeAttributeID,' Matches ',parent::Attributes/Attribute) " /> From template
</xsl:if>
</xsl:for-each>
</xsl:template>
转换后我发现它只映射了找到的属性,但是它不能正确映射,因为输出是:
Time Matches Time
Place Matches Time
因为所需的输出是:
Time Matches Time
Place Matches Place
我是否需要一个嵌套for-each?
答案 0 :(得分:0)
这是不对的..
您正在匹配模板,然后一次循环每个匹配1!删除
<xsl:for-each select="." />
它在这个上下文中基本上什么也没做,因为你选择了模板匹配的元素,所以你用循环你的上下文节点的简单术语。
另外请用您的预期输出更新您的问题,我相信我可以提供更详细的帮助!
此外,请确保您的示例xslt与您的示例xml匹配
答案 1 :(得分:0)
在稍微阅读了xsl中的测试工作后,我做对了。 没有做映射,只有1个变量在foreach循环中使用:
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="/Elements/Element/MGs/MG/Attributes/Attribute">
<xsl:variable name="id" select="ElementAttributeID" />
<div>
<xsl:value-of select="concat(/Attributes/Attribute[ID=$id]/Name,'matches',/Elements/Element/MGs/MG/Attributes/Attribute/ElementAttributeID)"/>
</div>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
给出正确的结果:
Time matches Time
Place matches Place