使用PHP在xml中检索xsl:variable

时间:2016-02-10 13:23:51

标签: php xml

Note.xml

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

<Table CreatedOn="Tue Nov 17 22:30:53 PST 2015" Name="Hello" Version="3.6.10294.2" TimeStamp="1447828253">
.....
.....
</Table>

Previoulsy我们使用了上面的xml文件并使用下面的PHP命令来检索Table标签Name和Version的值,并使用Xml对象处理Table数据以将其转换为其他格式。

PHP:

$xml = simplexml_load_file("note.xml")
$table_attrs = $xml->attributes();
if( 0 === strpos( $table_attrs["Name"], "Hello" ) )
{
.....
}
else if( 0 === strpos( $table_attrs["Name"], "Hai" ) )
{
.....
}

现在XML文件格式改变如下。所以我更改了下面的命令(即$ xml-&gt; Table [0] - &gt; attributes())以获取Table标签名称和版本,并将整个表格内容存储为XML对象以将其转换为其他格式。当我试图运行下面的PHP命令时,它会抛出错误“致命错误:调用null成员函数属性()”。请让我知道获取表名和版本的命令,以及如何将整个Table内容存储为xml对象

Note.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="#sc_stylesheet"?>
<!DOCTYPE supportchart [<!ATTLIST xsl:stylesheet id ID #REQUIRED>]>

<xsl:stylesheet id="sc_stylesheet" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" omit-xml-declaration="yes"/>
    <xsl:variable name="support_chart">
        <supportchart>
            <Table CreatedOn="Wed Feb 03 15:52:32 2016" Name="Hello" Version="4.2.326.0" Timestamp="1454543552.61">
            .....
            .....
            </Table>
        </supportchart>
    </xsl:variable> 
    <xsl:template match="Table">
    ....
    ....
    <xsl:template match="xsl:template"> </xsl:template>
</xsl:stylesheet>

PHP:

$xml = simplexml_load_file("note.xml")
$table_attrs = $xml->Table[0]->attributes();
if( 0 === strpos( $table_attrs["Name"], "Hello" ) )
{
.....
}
else if( 0 === strpos( $table_attrs["Name"], "Hai" ) )
{
.....
}

1 个答案:

答案 0 :(得分:0)

如前所述,XSLT是一个格式良好的XML文档,大多数解析器都应该处理它,但通常不会解析数据的脚本文件(类似于解析MySQL数据的PHP脚本)。但由于实际值用于XSLT的变量定义,因此请考虑使用SimpleXMLElement,然后使用其xpath()方法来解析所需的属性。在XPath查询中,属性在其引用中需要@,但节点值不需要:

$data = file_get_contents("$note.xml");
$xml = new SimpleXmlElement($data);

$nameArray = $xml->xpath("//Table/@Name");
$versionArray = $xml->xpath("//Table/@Version");
$timestampArray = $xml->xpath("//Table/@Timestamp");

如果您需要解析名称空间前缀中包含的节点或属性值(此处为xsl),则需要首先注册xsl名称空间:

$data = file_get_contents("$note.xml");
$xml = new SimpleXmlElement($data);

$xml->registerXPathNamespace('xsl', 'http://www.w3.org/1999/XSL/Transform');

$variableArray = $xml->xpath("//xsl:variable/@name");
相关问题