1

我正在尝试在 php 中使用 XML 和 XSLT 输出表单,但我无法以某种方式满足条件。这是我的 XML 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="form.xsl"?>

<root>

    <formset>
            <field>
                <type>text</type>                
                <value>This is test value</value>
            </field>
            <field>
                <type>radio</type>                
                <value>Male</value>
            </field>
            <field>
                <type>checkbox</type>                
                <value>Hobby</value>
            </field>
            <field>
                <type>button</type>                
                <value>Click Me</value>
            </field>                                    
    </formset>

</root>

这是我的 XSLT 文件:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>

    <xsl:template match="/">
        <html>
            <head>
                <title>Rendering of Form</title>
            </head>
            <body>
                <form action="" method="post">
                    <xsl:for-each select="/root/formset/field">

                        <xsl:choose>
                            <xsl:when test="type = text">
                                <input type="text" value="{value}" />
                            </xsl:when>
                            <xsl:when test="type = radio">
                                <input type="radio" value="{value}" /> <xsl:value-of select="value"/>
                            </xsl:when>
                            <xsl:when test="type = checkbox">
                                <input type="checkbox" value="{value}" /> <xsl:value-of select="value"/>
                            </xsl:when>
                            <xsl:when test="type = button">
                                <input type="button" value="{value}" />
                            </xsl:when>                
                            <xsl:otherwise>
                             <span>Unknown Type</span>
                            </xsl:otherwise>
                        </xsl:choose>             

                    </xsl:for-each>

                </form>



            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

我的 PHP 代码就是这样简单的回显输出:

<?php

// LOAD XML FILE
$XML = new DOMDocument();

$XML->load('form.xml');

// START XSLT
$xslt = new XSLTProcessor();
$XSL = new DOMDocument();

$XSL->load('form.xsl');
$xslt->importStylesheet( $XSL );
echo $xslt->transformToXML( $XML );

?>

但不知何故我的输出呈现xsl:otherwise条件谁能告诉我为什么?我是 XSLT 的新手

4

1 回答 1

2

这实际上与 PHP 无关,而只是与您在 xsl:when 测试语句中遗漏了一些撇号的事实有关。您目前正在执行此操作

 <xsl:when test="type = text">

但这是将一个名为type的元素与一个名为text的元素进行比较,该元素实际上并不存在于您的 XML 中。你需要这样做

 <xsl:when test="type = 'text'">

即您需要与用撇号括起来的文字字符串进行比较。

如果您热衷于学习 XSLT,这里有一种无需xsl:for-eachxsl:choose即可完成相同任务的方法

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="html"/>
   <xsl:template match="/">
      <html>
         <head>
            <title>Rendering of Form</title>
         </head>
         <body>
            <form action="" method="post">
               <xsl:apply-templates select="root/formset/field"/>
            </form>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="field">
      <input type="{type}" value="{value}"/>
   </xsl:template>

   <xsl:template match="field[type != 'text'][type != 'radio'][type != 'checkbox'][type != 'button']">
      <xsl:text>Unknown Type</xsl:text>
   </xsl:template>
</xsl:stylesheet>

以这种方式使用模板通常是首选,因为它有助于重用代码,并减少缩进以使其更具可读性。请注意,在匹配元素时,总是首先选择更具体的模板。

于 2012-12-31T09:41:16.533 回答