【问题标题】:XSLT enumerate each child elementXSLT 枚举每个子元素
【发布时间】:2013-09-12 17:40:22
【问题描述】:

我正在尝试创建一个超级通用的 XSLT,它基本上只能依靠存在的表和行元素。我有以下示例 XML,我正在尝试为其制作 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<table>
    <row>
        <id>5311</id>
        <status>Active</status>
        <id_vendor>Verizon</id_vendor>
        <mobile_number>555123456</mobile_number>
    </row>
    <row>
        <id>5312</id>
        <status>Inactive</status>
        <id_vendor>Sprint</id_vendor>
        <mobile_number>555123457</mobile_number>
    </row>
    <row>
        <id>5313</id>
        <status>Active</status>
        <id_vendor>ATT</id_vendor>
        <mobile_number>555123458</mobile_number>
    </row>
</table>

问题是我不知道这些字段最终会变成什么(id、status、id_vendor、mobile_number 等都可能发生变化。

我想让诸如以下的视图看起来很愉快:

<div style="background-color:#E3CA87;padding:.2em">
    <div style="background-color:#F1E2BB;padding:.2em">
        <div>id: x<div>
        <div>status: active<div>
        <div>id_vendor: Verizon<div>
        <div>mobile_number: 555123456<div>
    <div>
<div>

这是我到目前为止所拥有的......但我无法让匿名元素正常运行:

<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
  <body style="background-color:#eee;font-size:12pt;font-family:Arial;">
    <xsl:for-each select="table/row">
      <div style="background-color:#eee;padding:.5em">

       <xsl:for-each select="/*">

       <div style="background-color:#E3CA87;padding:.2em;border: 1px solid black">
        <xsl:for-each select="./*">
          <div style="background-color:#F1E2BB;padding:.2em">
<xsl:value-of select ="name(./*)"/>: 
<xsl:value-of select="*" />
          </div>
        </xsl:for-each>
      </div>
    </xsl:for-each>
      </div>
    </xsl:for-each>
  </body>
</html>

【问题讨论】:

  • 编辑后,您需要删除&lt;xsl:for-each select="/*"&gt;,然后您可以将&lt;xsl:for-each select="./*"&gt; 缩短为&lt;xsl:for-each select=".*"&gt;,然后您需要使用&lt;xsl:value-of select="local-name()"/&gt;&lt;xsl:value-of select="."/&gt;

标签: css xml xslt styles


【解决方案1】:

关闭...但实际上有点不同..只是想出来给任何想知道的人:

<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
  <body style="background-color:#eee;font-size:12pt;font-family:Arial;">
    <xsl:for-each select="table/row">
      <div style="background-color:#eee;padding:.5em">

       <xsl:for-each select=".">

       <div style="background-color:#E3CA87;padding:.2em;border: 1px solid black">
        <xsl:for-each select=".">
<xsl:for-each select="./*">
          <div style="background-color:#F1E2BB;padding:.2em">
 <xsl:value-of select="concat(local-name(.), ': ', .)" />
          </div>        
</xsl:for-each>
        </xsl:for-each>
      </div>
    </xsl:for-each>
      </div>
    </xsl:for-each>
  </body>
</html>

【讨论】:

  • 扔掉for-each select=".",它只会乱扔代码。
【解决方案2】:

使用相对路径,例如&lt;xsl:for-each select="*"&gt; 而不是 &lt;xsl:for-each select="/*"&gt;。然后我认为您想删除内部 for-each 并简单地将其替换为

<div style="background-color:#F1E2BB;padding:.2em">
           <xsl:value-of select="concat(local-name(), ': ', .)" />
          </div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    相关资源
    最近更新 更多