所以我想列出所有具有Specs节点的名称和文本的子节点。
<Item-Request model="MZ-7TE1T0BW" Supplier-Code="TOMSAM1TB">
<DisplayItem>
<Item href="SAM1TBMZ7TE1T0BW.jpg" model="MZ-7TE1T0BW">
<Name>Samsung SSD MZ-7TE1T0BW 1 TB 2.5 inch</Name>
<Price>630.99</Price>
<SupplierCode>TOMSAM1TB</SupplierCode>
<Description/>
<Specs>
<Capacity>1 TB</Capacity>
<Reading>540 MB/s</Reading>
<Writing>520 MB/s</Writing>
<FormFactor>2.5 "</FormFactor>
<Connecor>Sata III</Connecor>
<Size>
<Width>70 mm</Width>
<Height>7 mm</Height>
</Size>
<Weight>53 g</Weight>
</Specs>
<Supplier>TOM001</Supplier>
<SupplierName>Tom PC Hardware</SupplierName>
<Manufacturer>Samsung</Manufacturer>
</Item>
</DisplayItem>
</Item-Request>
我不能硬编码,因为这些值不是我现成的,可以添加或删除。所以我需要一些可以动态列出它们的东西。
到目前为止,我所能做的就是
<xsl:for-each select="DisplayItem/Item/Specs">
<xsl:for-each select="node()">
<xsl:value-of select="."/>
<br/>
</xsl:for-each>
</xsl:for-each>
上面在单独的一行列出了值,现在我需要能够显示元素名称。
我找到的解决方案是
<xsl:for-each select="DisplayItem/Item/Specs">
<xsl:for-each select="node()">
<xsl:value-of select="name()"/>
<xsl:value-of select="."/>
<br/>
</xsl:for-each>
</xsl:for-each>
我不确定这是否是正确的方式。
与其循环遍历所有子元素,不如为找到的Specs元素使用模板,并将每个元素转换为文本。
我会使用以下样式表(看起来你想生成HTML):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<xsl:text disable-output-escaping='yes'><!DOCTYPE html></xsl:text>
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="Specs">
<xsl:for-each select="*"> <!-- take all descendants of Specs -->
<p>
<xsl:value-of select="name()"/>
<xsl:text> = </xsl:text>
<!-- this just copies the text() of possible descendants! -->
<xsl:value-of select="."/>
</p>
</xsl:for-each>
</xsl:template>
<!-- do nothing for unmatched text or attribute nodes -->
<xsl:template match="text()|@*"/>
</xsl:stylesheet>
使用嵌套的规范(例如<Size>
)仍然会遇到问题。使用此模板,输出为(减去一些额外的空白):
<p>Size = 70 mm 7 mm</p>
您也可以尝试一下。
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes" />
<xsl:template match="/">
<xsl:copy-of select="//Specs"/>
</xsl:template>
</xsl:stylesheet>
应用于您的输入XML将;
输出:
<?xml version="1.0" encoding="UTF-8"?>
<Specs>
<Capacity>1 TB</Capacity>
<Reading>540 MB/s</Reading>
<Writing>520 MB/s</Writing>
<FormFactor>2.5 "</FormFactor>
<Connecor>Sata III</Connecor>
<Size>
<Width>70 mm</Width>
<Height>7 mm</Height>
</Size>
<Weight>53 g</Weight>
</Specs>