Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通用xml->;使用xslt和约定进行html转换?_Html_Css_Xml_Xslt - Fatal编程技术网

通用xml->;使用xslt和约定进行html转换?

通用xml->;使用xslt和约定进行html转换?,html,css,xml,xslt,Html,Css,Xml,Xslt,我一直在网络上搜寻类似的东西,作为一个懒惰的程序员,在我自己尝试这样做之前,我想我会在这里问一下 我想要的是一种方法,可以获取任何节点名符合约定(如cakephp或ruby)的xml,然后将数据以可打印格式呈现 即: 街道 致: 家庭住址街道 孩子们有单独的桌子 这看起来很简单,而且是以前很多次想要的东西。我发现了一个有用的讨论,但没有结论 我错过什么了吗?有没有一种简单的通用xslt/css方法可以实现这一点?或者这项工作每天在世界各地的小隔间里重复数百次 提前感谢, F使用以下XSL

我一直在网络上搜寻类似的东西,作为一个懒惰的程序员,在我自己尝试这样做之前,我想我会在这里问一下

我想要的是一种方法,可以获取任何节点名符合约定(如cakephp或ruby)的xml,然后将数据以可打印格式呈现

即:


街道
致:

家庭住址街道
孩子们有单独的桌子

这看起来很简单,而且是以前很多次想要的东西。我发现了一个有用的讨论,但没有结论

我错过什么了吗?有没有一种简单的通用xslt/css方法可以实现这一点?或者这项工作每天在世界各地的小隔间里重复数百次

提前感谢,


F

使用以下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>

街道
474
输出到

<tr><td>Home Address</td><td>The Street</td></tr>
<tr><td>Po Box</td><td>474</td></tr>
家庭住址街道
邮政信箱474

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

尽管你的问题太含糊了,欢迎你这样问。什么惯例?给我们一些输入XML和所需输出的示例。请编辑这个问题,也许有人能帮上忙。不过,你需要思考这个问题,并提出一些转换规则。事实上,你的问题太模糊了,无法给出有用的答案。谢谢詹姆斯。这就是我想要的。我会去寻求一些观点,然后投票表决。同时,我已经将xml转换为php数组并递归循环,但我更喜欢您的xslt方法。
<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>