列出XSLT元素的子节点



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

您也可以尝试一下。

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>

相关内容

  • 没有找到相关文章

最新更新