列出元素XSLT的子节点

时间:2013-11-23 00:07:33

标签: xml xslt xslt-2.0

所以我想列出所有具有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>

以上列出了单独一行的值,现在我需要能够显示元素名称。

3 个答案:

答案 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'>&lt;!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>