所以我想列出所有具有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>
以上列出了单独一行的值,现在我需要能够显示元素名称。
答案 0 :(得分:2)
我找到的解决方案是
<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>
我不确定这是否正确。
答案 1 :(得分:1)
您应该使用您找到的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>
答案 2 :(得分:0)
你也可以尝试一下。
<强> 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>