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と呼ばれる要素を、実際には XML に存在しないtextと呼ばれる要素と比較しています。代わりにこれを行う必要があります

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

つまり、アポストロフィで囲まれたリテラル文字列と比較する必要があります。

XSLT を学習したい場合は、 xsl:choosexsl:for-eachを使用せずに同じことを行う方法を次に示します。

<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 に答える