选择节点以通过XSL进行迭代

时间:2011-02-12 14:12:15

标签: xslt

我正在开发免费购物车网关,该网关将每个项目存储为XML

因此给出了以下XML结构

<basket>
    <item id="1">
        <item-title>value</item-title>
        <item-description>value</item-description>
        <item-quanity>value</item-quanity>
        <item-price>value</item-price>
        <item-on>value</item-on>
        <item-os>value</item-os>
        <item-on>value</item-on>
        <item-os>value</item-os>
        <item-on>value</item-on>
        <item-os>value</item-os>
    </item>
    <item id="2">
        <item-title>value</item-title>
        <item-description>value</item-description>
        <item-quanity>value</item-quanity>
        <item-price>value</item-price>
        <item-on>value</item-on>
        <item-os>value</item-os>
        <item-on>value</item-on>
        <item-os>value</item-os>
    </item>
</basket>

是否可以通过XSL仅选择每个项目的选项节点

所以简而言之,我永远不知道每个项目会提交多少个选项,我想在篮子里显示选项

目前我正在使用这个XML结构

<item id="1">
    <options>
        <option index="0">
            <on>Color</on>
            <os>Blue</os>
        </option>
        <option index="1">
            <on>Size</on>
            <os>5</os>
        </option>
    </options>
    <quantity>1</quantity>
    <item-name>Skate Board Trainers</item-name>
    <item-description>0011005</item-description>
    <unit-price>1.00</unit-price>
    <item-img>images/skate.gif</item-img>
    <item-url>http://cgdomestics2-co-uk.server9.controldns.co.uk/dev3/</item-url>
</item>
<item id="2">
    <options>
        <option index="0">
            <on>Color</on>
            <os>Blue</os>
        </option>
    </options>
    <quantity>1</quantity>
    <item-name>Tattoo Bottle Cap Belt - Recycled</item-name>
    <item-description>0011w346</item-description>
    <unit-price>1.00</unit-price>
    <item-img>images/belt.gif</item-img>
    <item-url>http://cgdomestics2-co-uk.server9.controldns.co.uk/dev3/</item-url>
</item>

所以在XSL中,我可以简单地选择thr选项节点并迭代它们,但是为了产生这种结构,使得XML转换的形式真的很复杂,并且希望它从XSL更简单

2 个答案:

答案 0 :(得分:1)

使用更经典的XSLT方法,这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="item-os"/>
    <xsl:template match="item-on">
        <option index="{count(preceding-sibling::item-on)+1}">
            <xsl:apply-templates
                 select=".|following-sibling::*[1]/self::item-os"
                 mode="output"/>
        </option>
    </xsl:template>
    <xsl:template match="*" mode="output">
        <xsl:element name="{substring-after(name(),'item-')}">
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

输出:

<basket>
    <item id="1">
        <item-title>value</item-title>
        <item-description>value</item-description>
        <item-quanity>value</item-quanity>
        <item-price>value</item-price>
        <option index="1">
            <on>value</on>
            <os>value</os>
        </option>
        <option index="2">
            <on>value</on>
            <os>value</os>
        </option>
        <option index="3">
            <on>value</on>
            <os>value</os>
        </option>
    </item>
    <item id="2">
        <item-title>value</item-title>
        <item-description>value</item-description>
        <item-quanity>value</item-quanity>
        <item-price>value</item-price>
        <option index="1">
            <on>value</on>
            <os>value</os>
        </option>
        <option index="2">
            <on>value</on>
            <os>value</os>
        </option>
    </item>
</basket>

注意:身份规则复制输入不变。 “item-on”规则输出option元素,其中@index具有AVT并处理自我和下一个兄弟,如果它是item-so模式中的"output"元素。清空“item-so”规则。 “output模式中的任何元素”规则,生成具有动态名称的元素并应用模板。

答案 1 :(得分:0)

您可以使用following-sibling

输入XML:

<?xml version="1.0" encoding="utf-8" ?>
<basket>
  <item id="1">
    <item-title>Item 1</item-title>
    <item-on>Color</item-on>
    <item-os>Blue</item-os>
    <item-on>Size</item-on>
    <item-os>5</item-os>
  </item>
  <item id="2">
    <item-title>Item 2</item-title>
    <item-on>Color</item-on>
    <item-os>Red</item-os>
  </item>
</basket>

XSLT:

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

  <xsl:template match="/">
    <basket>
      <xsl:for-each select="basket/item">
        <item id="{@id}">
          <item-title><xsl:value-of select="item-title"/></item-title>
          <options>
            <xsl:for-each select="item-on">
              <option>
                <on><xsl:value-of select="."/></on>
                <os><xsl:value-of select="following-sibling::item-os"/></os>
              </option>
            </xsl:for-each>
          </options>
        </item>
      </xsl:for-each>
    </basket>
  </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0" encoding="utf-8"?>
<basket>
  <item id="1">
    <item-title>Item 1</item-title>
    <options>
      <option>
        <on>Color</on>
        <os>Blue</os>
      </option>
      <option>
        <on>Size</on>
        <os>5</os>
      </option>
    </options>
  </item>
  <item id="2">
    <item-title>Item 2</item-title>
    <options>
      <option>
        <on>Color</on>
        <os>Red</os>
      </option>
    </options>
  </item>
</basket>