#html #xml #xslt
#HTML #xml #xslt
Вопрос:
У меня есть XML-файл, который содержит список производителей, которые распознаются MembershipNo (первичный ключ) и TokenNo (внешний ключ). Каждый производитель производит 4 продукта (идентификатор в качестве первичного ключа). Я пытаюсь создать файл XSLT для этого XML:
<Manufacturers>
<Manufacturer>
<CompanyName>Axxon</CompanyName>
<MembershipNo>1075628126</MembershipNo>
<Token>
<TokenNo>1</TokenNo>
</Token>
<Address>20 Lynagh Crt, Arana Hills, QLD 4054</Address>
<Contact>61889800081</Contact>
<Products>
<Product>
<ID>12345678</ID>
<Amount>100</Amount>
<Weight>50</Weight>
<Pricing>150</Pricing>
<Restriction>true</Restriction>
<MoneyBackGuarantee>true</MoneyBackGuarantee>
<DCC>150</DCC>
</Product>
<Product>
<ID>215800</ID>
<Amount>110</Amount>
<Weight>102</Weight>
<Pricing>16</Pricing>
<Restriction>true</Restriction>
<MoneyBackGuarantee>true</MoneyBackGuarantee>
<DCC>8572</DCC>
</Product>
<Product>
<ID>726360</ID>
<Amount>234</Amount>
<Weight>801</Weight>
<Pricing>95</Pricing>
<Restriction>false</Restriction>
<MoneyBackGuarantee>false</MoneyBackGuarantee>
<DCC>0</DCC>
</Product>
<Product>
<ID>749742</ID>
<Amount>148</Amount>
<Weight>308</Weight>
<Pricing>21</Pricing>
<Restriction>false</Restriction>
<MoneyBackGuarantee>true</MoneyBackGuarantee>
<DCC>4108</DCC>
</Product>
</Products>
</Manufacturer>
<Manufacturer>
<CompanyName>Neuron Mobile</CompanyName>
<MembershipNo>3116608681</MembershipNo>
<Token>
<TokenNo>2</TokenNo>
</Token>
<Address>10 Short St, Carisbrook, VIC 3464</Address>
<Contact>61887693560</Contact>
<Products>
<Product>
<ID>110053</ID>
<Amount>175</Amount>
<Weight>147</Weight>
<Pricing>51</Pricing>
<Restriction>false</Restriction>
<MoneyBackGuarantee>false</MoneyBackGuarantee>
<DCC>9014</DCC>
</Product>
<Product>
<ID>346779</ID>
<Amount>881</Amount>
<Weight>137</Weight>
<Pricing>35</Pricing>
<Restriction>true</Restriction>
<MoneyBackGuarantee>true</MoneyBackGuarantee>
<DCC>0</DCC>
</Product>
<Product>
<ID>244630</ID>
<Amount>365</Amount>
<Weight>780</Weight>
<Pricing>74</Pricing>
<Restriction>false</Restriction>
<MoneyBackGuarantee>false</MoneyBackGuarantee>
<DCC>5312</DCC>
</Product>
<Product>
<ID>996380</ID>
<Amount>793</Amount>
<Weight>286</Weight>
<Pricing>21</Pricing>
<Restriction>false</Restriction>
<MoneyBackGuarantee>true</MoneyBackGuarantee>
<DCC>3744</DCC>
</Product>
</Products>
</Manufacturer>
Я хочу, чтобы файл XSL создавал 3 html-таблицы, но при использовании следующего XSL он не показывает никаких данных в MembershipNo:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body style="font-family:Arial;font-size:12pt;background-color:#ffff">
<h1>Manufacturers</h1>
<table border="1">
<tr bgcolor="#3399ff">
<th>Manufacturer</th>
<th>MembershipNo</th>
<th>Token</th>
<th>Address</th>
<th>Contact</th>
</tr>
<xsl:for-each select="Manufacturers/Manufacturer">
<tr>
<td><xsl:value-of select="CompanyName"/></td>
<td><xsl:value-of select="MembershipNo"/></td>
<td><xsl:value-of select="Token/TokenNo"/></td>
<td><xsl:value-of select="Address"/></td>
<td><xsl:value-of select="Contact"/></td>
</tr>
</xsl:for-each>
</table>
<h1>Products</h1>
<table border="1">
<tr bgcolor="#3399ff">
<th>ID</th>
<th>Amount</th>
<th>Weight</th>
<th>Pricing</th>
<th>Restriction</th>
<th>MoneyBackGuarantee</th>
<th>DCC</th>
</tr>
<xsl:for-each select="Manufacturers/Manufacturer/Products/Product">
<tr>
<td><xsl:value-of select="ID"/></td>
<td><xsl:value-of select="Amount"/></td>
<td><xsl:value-of select="Weight"/></td>
<td><xsl:value-of select="Pricing"/></td>
<td><xsl:value-of select="Restriction"/></td>
<td><xsl:value-of select="MoneyBackGuarantee"/></td>
<td><xsl:value-of select="DCC"/></td>
</tr>
</xsl:for-each>
</table>
<table border="1">
<tr bgcolor="#3399ff">
<th>MembershipNo</th>
<th>ID</th>
</tr>
<xsl:for-each select="/Manufacturers/Manufacturer/Products/Product">
<tr>
<td><xsl:value-of select="div/MembershipNo"/></td>
<td><xsl:value-of select="ID"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Ответ №1:
Ваш xslt
блок кода для построения 3-й таблицы содержит продукты производителя в качестве активного набора узлов.
<xsl:for-each select="/Manufacturers/Manufacturer/Products/Product">
<tr>
<td><xsl:value-of select="div/MembershipNo"/></td>
<td><xsl:value-of select="ID"/></td>
</tr>
</xsl:for-each>
Чтобы показать MembershipNo
производителя, вам нужно подняться на 2 уровня вверх.
Поэтому вместо использования <xsl:value-of select="div/MembershipNo"/>
это должно быть <xsl:value-of select="../../MembershipNo" />
Полный пример
<xsl:for-each select="/Manufacturers/Manufacturer/Products/Product">
<tr>
<td><xsl:value-of select="../../MembershipNo" /></td>
<td><xsl:value-of select="ID"/></td>
</tr>
</xsl:for-each>