【问题标题】:Generic xml -> html conversion using xslt and convention?使用 xslt 和约定的通用 xml -> html 转换?
【发布时间】:2012-06-29 14:03:13
【问题描述】:

我一直在网上搜索类似的东西并且是一个懒惰的程序员,在我自己尝试这样做之前,我想我会在这里问。

即:

<xml>
<home_address>The Street</home_address>
</xml>

到:

<tr><td>Home Address</td><td>The Street</td></tr>

等等。孩子们有单独的桌子。

这似乎很简单,而且以前很多次都需要。我发现了一个有用的讨论,但没有结论。

http://www.daniweb.com/software-development/xml-xslt-and-xpath/threads/363621/xml-to-html-using-xslt-without-hardcoding-node-names-in-xslt

我在这里错过了什么吗?是否有一个简单的通用 xslt/css 方法来执行此操作?还是这项工作每天在世界各地的小隔间中重复数百次?

提前致谢,

F

【问题讨论】:

  • 欢迎来到 SO,虽然你的问题太模糊了。什么约定?给我们一些示例输入 XML 和所需的输出。请编辑问题,有人可以提供帮助。
  • 您需要考虑这一点,并提出一些转换规则。事实上,您的问题太模糊,无法给出有用的答案。

标签: html css xml xslt


【解决方案1】:

使用以下 XSL 样式表。我已经测试过了,它可以工作。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:template match="/">
    <xsl:for-each select="*">
      <xsl:for-each select="*">
        <tr>
          <xsl:variable name="NodeNameClearText">
            <xsl:call-template name="repalceNodeName">
              <xsl:with-param name="value" select="local-name(.)"/>
            </xsl:call-template>
          </xsl:variable>
              <td>
                <xsl:value-of select="$NodeNameClearText" />
              </td>
              <td>
                <xsl:value-of select="." />
              </td>
            </tr>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>

  <xsl:template name="repalceNodeName">
    <xsl:param name="value"/>
    <xsl:variable name="valueWithoutUnderscores">
      <xsl:value-of select="translate($value, '_',' ')"/>
    </xsl:variable>
    <xsl:call-template name="caseLowerAcceptFirstWord">
      <xsl:with-param name="data" select="$valueWithoutUnderscores"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="caseDown">
    <xsl:param name="data"/>
    <xsl:if test="$data">
      <xsl:choose>
        <xsl:when test="starts-with($data,' ')">
          <xsl:text> </xsl:text>
          <xsl:call-template name="caseLowerAcceptFirstWord">
            <xsl:with-param name="data" select="normalize-space(substring($data,2))"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="translate(substring($data,1,1),
                                  'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')"/>
          <!-- put all the chars you want to change 
                 into the last two strings -->
          <xsl:call-template name="caseDown">
            <xsl:with-param name="data" select="substring($data,2)"/>
          </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:if>
  </xsl:template>

  <xsl:template name="caseUP">
    <xsl:param name="data"/>
    <xsl:if test="$data">
      <xsl:choose>
        <xsl:when test="starts-with($data,' ')">
          <xsl:text> </xsl:text>
          <xsl:call-template name="caseLowerAcceptFirstWord">
            <xsl:with-param name="data" select="substring($data,2)"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="translate(substring($data,1,1),
                                  'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
          <!-- put all the chars you want to change 
                 into the last two strings -->
          <xsl:call-template name="caseDown">
            <xsl:with-param name="data" select="substring($data,2)"/>
          </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:if>
  </xsl:template>

  <xsl:template name="caseLowerAcceptFirstWord">
    <xsl:param name="data"/>
    <xsl:variable name="upperData">
      <xsl:call-template name="caseUP">
        <xsl:with-param name="data" select="$data"/>
      </xsl:call-template>
    </xsl:variable>
    <xsl:if test="$upperData">
      <xsl:value-of select="substring($upperData,1,1)"/>
      <xsl:call-template name="caseDown">
        <xsl:with-param name="data" select="substring($data,2)"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

关于我测试的内容的更多信息。以下 XML:

<xml>
<home_address>The Street</home_address>
<po_box>474</po_box>
</xml>

输出到

<tr><td>Home Address</td><td>The Street</td></tr>
<tr><td>Po Box</td><td>474</td></tr>

如果这不是你想要的,那么你的问题就是含糊不清

【讨论】:

  • 谢谢詹姆斯。这就是我所追求的。我会去寻求一些积分并投票赞成。与此同时,我已经将 xml 转换为 php 数组并递归循环,但我更喜欢你的 xslt 方法。
猜你喜欢
  • 1970-01-01
  • 2014-03-08
  • 2012-09-29
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2013-06-12
  • 2012-03-19
相关资源
最近更新 更多