如何将具有不同父标签的多值子标签的值置于 XSLT 中的公共标头标签下

问题描述 投票:0回答:1

我试图在循环中打印多次出现的值,其中一个值的标头标记与另一个不同。 child3 标签的数量可能比 child1 标签多,但第三次出现的 child3 标签将被忽略,因为只有两次出现的 child1 标签可用。

<?xml version="1.0" encoding="UTF-8"?>
<Parent1>
  <Parent2>
    <child1>JOHN ONE</child1>
    <child1>JOHN TWO</child1>
    <child2>JACK ONE</child2>
    <child2>JACK TWO</child2>
  </Parent2>
  <child3>JAMES ONE</child3>
  <child3>JAMES TWO</child3>
  <child3>JAMES THREE</child3>
</Parent1>

我尝试过的代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
      <xsl:for-each select="Parent1">
<Children >
<child1>
        <xsl:value-of select="Parent2/child1" />
</child1>
<child2>
        <xsl:value-of select="Parent2/child2" />
</child2>
<child3>
        <xsl:value-of select="child3" />
</child3>
</Children>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

我得到的实际输出:

<Children>
  <child1>JOHN ONE</child1>
  <child2>JACK ONE</child2>
  <child3>JAMES ONE</child3>
</Children>

预期输出是:

<Children>
  <child1>JOHN ONE</child1>
  <child2>JACK ONE</child2>
  <child3>JAMES ONE</child3>
</Children>
<Children>
  <child1>JOHN TWO</child1>
  <child2>JACK TWO</child2>
  <child3>JAMES TWO</child3>
</Children>
templates foreach xslt-1.0
1个回答
0
投票

使用给定的输入,可以使用以下方法产生预期的输出:

XSLT 1.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:template match="/Parent1">
    <xsl:for-each select="Parent2/child1">
        <xsl:variable name="i" select="position()" />
        <Children>
            <xsl:copy-of select="."/>
            <xsl:copy-of select="../child2[$i]"/>
            <xsl:copy-of select="/Parent1/child3[$i]"/>
        </Children>
    </xsl:for-each> 
</xsl:template>

</xsl:stylesheet>

请注意,输出是 XML 片段,而不是格式良好的 XML 文档。

© www.soinside.com 2019 - 2024. All rights reserved.