我正在开发免费购物车网关,该网关将每个项目存储为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更简单
答案 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>