XSLT组合来自两个列表

时间:2015-12-07 10:27:21

标签: xslt

我在A中有一个值列表,在B中有一个值列表。 我想为B中的值输出A,(或重复)的值。因此,如果我们在B中有4个值,我们在A中重复3个值,4次。

  <a>
   <v>1</v>
   <v>2</v>
   <v>3</v>
  </a>
  <b>
   <v>y</v>
   <v>z</v>
  </b>

应该导致

  <x>1</x>
  <x>2</x>
  <x>3</x>
  <x>1</x>
  <x>2</x>
  <x>3</x>

这是我尝试过的

  <xsl:foreach select="a/v">
    <xsl:foreach select="b/v">
      <x><xsl:value-of select="."></x>
    </xsl:foreach>
  </xsl:foreach>

2 个答案:

答案 0 :(得分:1)

考虑到良好的输入:

<强> XML

<root>
  <a>
    <v>1</v>
    <v>2</v>
    <v>3</v>
  </a>
  <b>
    <v>y</v>
    <v>z</v>
  </b>
</root>

以下样式表:

XST 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:template match="/root">
    <xsl:copy>
        <xsl:for-each select="b/v">
            <xsl:for-each select="/root/a/v">
                <x><xsl:value-of select="."/></x>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

将返回:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <x>1</x>
  <x>2</x>
  <x>3</x>
  <x>1</x>
  <x>2</x>
  <x>3</x>
</root>

稍高效的版本:

<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:template match="/root">
    <xsl:variable name="a">
        <xsl:for-each select="a/v">
            <x><xsl:value-of select="."/></x>
        </xsl:for-each>
    </xsl:variable>
    <xsl:copy>
        <xsl:for-each select="b/v">
            <xsl:copy-of select="$a"/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

给定输入XML:

var chart_graph_ent = d3.select(".chart").selectAll(".chart__graph")
    .data(data)
    .enter()
    .append("div").attr("class", "chart__graph")
chart_graph_ent.append("div").attr("class", "chart__graph__min")
...

1.0 XSLT样式表:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <a>
    <v>1</v>
    <v>2</v>
    <v>3</v>
  </a>
  <b>
    <v>y</v>
    <v>z</v>
  </b>
</root>

提供输出:

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/root">
  <xsl:apply-templates select="b/v"/>
</xsl:template>

<xsl:template match="b/v">
  <xsl:apply-templates select="../../a/v"/>
</xsl:template>

<xsl:template match="a/v">
  <x><xsl:value-of select="."/></x>
</xsl:template>

</xsl:stylesheet>

最好避免使用123123 循环并改为使用模板。