PHP Conference Japan 2024

XSL

新增註解

使用者貢獻的註解 23 則註解

6
匿名
18 年前
回覆 appletalk at gmail dot com
<snip>
許多人可能已經注意到,如果存在 '&nbsp;' 實體,DOM 解析器會給出錯誤。E_WARN 訊息看起來像
警告:DOMDocument::load() [function.load]:未定義實體 'nbsp' 在 ...
有很多方法可以解決這個問題
.....
b) 定義 &nbsp;
在文件的頂部,在 <?xml?> 定義之後,新增
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp "&#160;" >
]>
.......</snip>
只是想讓大家知道選項 b 無效。我不確定為什麼它沒有正確實作,但它就是無效,所以不要浪費時間。不幸的是,DOMXSL 轉換比舊的 xslt 函式功能少很多。
3
adrian at foeder dot de
18 年前
如果您想在 XSL 樣式表內使用 document() 函式,請注意您必須使用絕對路徑。
對 Windows 使用者很重要:絕對路徑 *必須* 使用正斜線,因此在轉換文件之前,將 Windows 路徑反斜線取代為正斜線。

範例
這將無效
<xsl:copy-of select="document('test.xml')" />

這也將無效
<xsl:copy-of select="document('c:\temp\test.xml')" />

但這將有效
<xsl:copy-of select="document('c:/temp/test.xml')" />
2
rd at jerntorget dot se
20 年前
如果您收到以下警告訊息

xsltApplyOneTemplate: _if_ 未在 (例如,如果可以是 apply-template 或其他方法) 中編譯,我發現問題似乎是在 <xsl:if> 或其他引起問題的東西之前的 &nbsp;。

解決問題的一種方法是像這樣在 &nbsp; 周圍使用 span 標籤:<span>&nbsp;</span>
3
Jaroslaw Zabiello
13 年前
這更有用,不需要檔案,它只將 XML 和 XSL 字串作為輸入參數,並傳回轉換後的 XML

<?php
/**
* @param $xml
* @param $xsl
* @return string xml
*/
function transform($xml, $xsl) {
$xslt = new XSLTProcessor();
$xslt->importStylesheet(new SimpleXMLElement($xsl));
return
$xslt->transformToXml(new SimpleXMLElement($xml));
}
?>
1
emilise dot victor at gmail dot com
16 年前
這是一種在不使用 <xml:message> 的情況下取得輸出的方法:使用 php 的 var_dump 函式
- 首先使用以下程式碼繫結 php 函式
<? $xslt->registerPHPFunctions() ?>
以及樣式表中的 xmlns:php="https://php.dev.org.tw/xsl"
- 然後您可以像這樣呼叫 var_dump 函式:<xsl:variable name="a" select="php:function('var_dump', $return)" />

我找不到一種呼叫函式並在不建立變數的情況下真正列印結果的方法,但好吧,它只是用於偵錯...
1
gabriel dot birke at web dot de
17 年前
每個 <xsl:message> 標籤都會產生 PHP 錯誤 (警告級別)。如果您想收集和美觀地列印它們,您可以使用在靜態變數中收集警告的自訂錯誤處理函式。
1
Fabrice Bonny
18 年前
回覆如何在 XSLT 中使用來自 DTD(內部或外部)的實體。如果您這樣做,它會起作用

$xsl = new DOMDocument;
$xsl->resolveExternals = TRUE;
$xsl->substituteEntities = TRUE;
$xsl->load(...);

希望這對您有幫助!;-)
1
kekoajs at yahoo dot com
19 年前
哇,我花了一天的大部分時間尋找如何將整個測試運算式傳遞給 XSL 樣式表。似乎 XSLT 1.0 規格不支援它,但 PHP 5(可能還有 4)包含 EXSLT 允許您執行此操作...

只需新增以下程式碼...

xmlns:dyn="http://exslt.org/dynamic"
extension-element-prefixes="dyn"

到 <xsl:stylesheet> 元素,並且在使用儲存在 <xsl:param> 元素中的運算式時,寫入

<xsl:if test="dyn:evaluate($param-name)">

瞧!您現在可以使用在樣式表外部產生的運算式!

EXSLT 新增了許多有用的函式,可以類似的方式整合到您的 XSL 中。您可以前往 http://exslt.org/ 以了解更多資訊...
2
匿名
18 年前
在 Windows 下啟用 libxslt 程式庫,PHP 5

要啟用
在您的 php.ini 中
1. 取消註解 ;extension=php_xsl.dll
2. 將 extension_dir 變更為
extension_dir = "./ext"

確認方式
1. 在 test.php 頁面中
<?php phpinfo() ?>
2. 執行 test.php
3. 搜尋 "libxslt Version"。它應該會在 XSL 標題的表格中返回版本號。

更多資訊請 Google 搜尋
"Configuring and Testing PHP Servers for XSL Support"
1
basslines at gmail dot com
18 年前
據我所知,LibXML/LibXSLT/LibEXSLT 最新的穩定版本不支援 xPath 2.0 / XSLT 2.0 轉換。我發現唯一支援 XSLT 2.0 的是在 Java 的 SAXON 處理器中 (http://saxon.sourceforge.net/)。
2
rojaro
20 年前
如果您想從變數(例如 $xmldata)中使用 XML,但從檔案中使用 XSLT 樣式表,您也可以使用以下方式:

<?php
$xslt
= new xsltProcessor;
$xslt->importStyleSheet(DomDocument::load('filename.xsl'));
print
$xslt->transformToXML(DomDocument::loadXML($xmldata));
?>
1
Vasil Rangelov
17 年前
@basslines at gmail dot com
"
據我所知,LibXML/LibXSLT/LibEXSLT 最新的穩定版本不支援 xPath 2.0 / XSLT 2.0 轉換。我發現唯一支援 XSLT 2.0 的是在 Java 的 SAXON 處理器中 (http://saxon.sourceforge.net/)。
"

使用 SAXON 或 AltovaXML 的 JAVA 綁定可能會很困難,而且 .NET 似乎有錯誤(至少對我來說)。不過,我建立了一個從命令列使用 SAXON 或 AltovaXML 的類別。如果 AltovaXML 註冊為 COM 元件,也可以與 COM 一起使用。

您可以從以下網址下載我的封裝程式:
http://xslt2processor.sourceforge.net/

我仍然需要實作更優雅的錯誤處理(就像 XSL 擴充功能使用 Libxml 函數的方式),並且一旦此錯誤
http://bugs.php.net/bug.php?id=41577
修復後,我也會實作 .NET 介面。

我將感謝任何回饋。
1
appletalk at gmail dot com
19 年前
許多人可能已經注意到,如果存在 '&nbsp;' 實體,DOM 解析器會給出錯誤。E_WARN 訊息看起來像

警告:DOMDocument::load() [function.load]:未定義實體 'nbsp' 在 ...

有很多方法可以解決這個問題
a) 困難的方式
<xsl:text disable-output-escaping="yes"> &amp;nbsp;</xsl:text>

b) 定義 &nbsp;
在文件的頂部,在 <?xml?> 定義之後,新增
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp "&#160;" >
]>

c) 外部 Doctype
如果您需要其他 HTML 實體,可以使用具有適當定義的外部 doctype

<!DOCTYPE page SYSTEM "http://gv.ca/dtd/character-entities.dtd">

當然,您可以下載該檔案並將其放置在您的伺服器中。
2
mnot at mnot dot net
17 年前
您可以透過在環境中設定 http_proxy 來為 XSLT document() 函數使用 HTTP Proxy(以及 DTD 外部參考)。

例如,在 Apache 設定中:

SetEnv http_proxy http://127.0.0.1:3128/
1
sudhir dot vis at gmail dot com
15 年前
這是從 PHP 轉換 XML 的最簡單方法:

<?php
$sXml
= "<xml>";
$sXml .= "<sudhir>hello sudhir</sudhir>";
$sXml .= "</xml>";

# 載入 XML 檔案
$XML = new DOMDocument();
$XML->loadXML( $sXml );

# 開始 XSLT
$xslt = new XSLTProcessor();
$XSL = new DOMDocument();
$XSL->load( 'xsl/index.xsl', LIBXML_NOCDATA);
$xslt->importStylesheet( $XSL );
# 列印
print $xslt->transformToXML( $XML );
?>
1
geoffreyj dot lee at gmail dot com
17 年前
以下是一些對跨瀏覽器相容性有用的提示。

假設

<script type="text/javascript" src="test.js"></script>

XSLT 會自動將其縮減為

<script type="text/javascript" src="test.js"/>

雖然這很好,但 Internet Explorer 會在空的 script 標籤上出現問題。因此,簡單的解決方案是新增一些內容來防止空的標籤。例如:

<script type="text/javascript" src="test.js"><xsl:comment/></script>

產生

<script type="text/javascript" src="test.js">

</script>

------------------------

此外,這是一種使用 IE 的條件註解的方法

<xsl:comment>[if gte IE 5]&#62;
&#60;link rel="stylesheet" type="text/css" href="ie.css" /&#62;
&#60;![endif]</xsl:comment>

產生

<!--[if gte IE 5]>
<link rel="stylesheet" type="text/css" href="ie.css" />
<![endif]-->

這可讓您隔離 IE 相關的 CSS,而無需使用醜陋的 CSS Hacks。
1
jw at jwscripts dot com
20 年前
以下程式碼是一個封裝程式,可支援呼叫某些舊的 xslt_* 函數

<?

if (PHP_VERSION >= 5) {
// 模擬舊的 xslt 函式庫函數
function xslt_create() {
return new XsltProcessor();
}

function xslt_process($xsltproc,
$xml_arg,
$xsl_arg,
$xslcontainer = null,
$args = null,
$params = null) {
// 首先準備參數
$xml_arg = str_replace('arg:', '', $xml_arg);
$xsl_arg = str_replace('arg:', '', $xsl_arg);

// 建立 DomDocument 類別的執行個體
$xml = new DomDocument;
$xsl = new DomDocument;

// 載入 XML 文件和 XSL 範本
$xml->loadXML($args[$xml_arg]);
$xsl->loadXML($args[$xsl_arg]);

// 載入 XSL 範本
$xsltproc->importStyleSheet($xsl);

// 如果已定義,則設定參數
if ($params) {
foreach ($params as $param => $value) {
$xsltproc->setParameter("", $param, $value);
}
}

// 開始轉換
$processed = $xsltproc->transformToXML($xml);

// 如果指定,則將結果放入檔案
if ($xslcontainer) {
return @file_put_contents($xslcontainer, $processed);
} else {
return $processed;
}

}

function xslt_free($xsltproc) {
unset($xsltproc);
}
}

$arguments = array(
'/_xml' => file_get_contents("newxslt.xml"),
'/_xsl' => file_get_contents("newxslt.xslt")
);

$xsltproc = xslt_create();
$html = xslt_process(
$xsltproc,
'arg:/_xml',
'arg:/_xsl',
null,
$arguments
);

xslt_free($xsltproc);
print $html;

?>
0
pb at online-magazin dot at
17 年前
呼叫 Saxon XSLT 處理器是一項非常簡單的任務!

您只需要執行一些簡單的任務:

1. 安裝 PHP 的 JavaBridge

2. 從 http://saxon.sourceforge.net/ 下載免費 (B) Saxon 發行版本

3. 將 jar 檔案放置在您可以存取的目錄中

4. 使用此程式碼範例:

// jar 檔案所在目錄
define("SAXON_DIR", $_SERVER['DOCUMENT_ROOT']."/saxonb8.9.0/");

// 包含 jar 檔案
java_require(SAXON_DIR."saxon8.jar;".SAXON_DIR."saxon8-dom.jar");


$sXslFile = $_SERVER['DOCUMENT_ROOT']."/myfirst.xsl"; // XSL 檔案
$sXmlFile = $_SERVER['DOCUMENT_ROOT']."/myfirst.xml"; // XML 檔案

try
{
$oXslSource = new java("javax.xml.transform.stream.StreamSource", "file://".$sXslFile);
$oXmlSource = new java("javax.xml.transform.stream.StreamSource", "file://".$sXmlFile);

$oFeatureKeys = new JavaClass("net.sf.saxon.FeatureKeys");

// 建立 Factory
$oTransformerFactory = new java("net.sf.saxon.TransformerFactoryImpl");

// 停用來源文件驗證
$oTransformerFactory->setAttribute($oFeatureKeys->SCHEMA_VALIDATION, 4);

// 建立新的 Transformer
$oTransFormer = $oTransformerFactory->newTransformer($oXslSource);

// 建立 StreamResult 來儲存輸出
$oResultStringWriter = new java("java.io.StringWriter");
$oResultStream = new java("javax.xml.transform.stream.StreamResult", $oResultStringWriter);

// 轉換
$oTransFormer->transform($oXmlSource, $oResultStream);

// 從轉換中回顯輸出
echo java_cast($oResultStringWriter->toString(), "string");

}
catch(JavaException $e){
echo java_cast($e->getCause()->toString(), "string");
exit;
}

5. 盡情享受

這運作得相當順利。
0
venkatesh at lammersmedical dot com
19 年前
這是一個從儲存為文字檔的 XSL 工作表讀取的函數。

function ReadExcelSheet($filename){
$test=file($filename);
$ar1=str_replace("~[^\t]*\t","\t",$test);
$ar2=str_replace("~","",$ar1);
$ar=str_replace("?","",$ar2);
$temp=array();
for ($i=0; $i<count($ar); $i++) {
if((substr($ar[$i],0,1)!= "\t")){
if($ar[$i]!=="\r\n"){
array_push($temp,$ar[$i]);
}
}
}
$name=split("\t",$temp[0]);
$ExcelList=array();
for($i=1;$i<count($temp);$i++){
$split_result=split("\t",$temp[$i]);
array_push($ExcelList,$split_result);
}
$result=insert_into_array($ExcelList,0,$name);
return($result);
}
-1
visual77 at gmail dot com
16 年前
使用 XSLTProcessor 來產生整個網站有點麻煩,主要是因為透過 DOMDocument 的 createElement 和 appendChild 函數建立 XML 樹的過程很繁瑣。

為了僅從 XML 和 XSL (它實際上比僅回顯 HTML 優越) 中取得整個網站,您可以使用一個物件來執行所有 PHP 資料結構到 XML 資料樹的轉換,並與 XSLTProcessor 結合以進行呈現。一個很好的物件就像 DOMi,您可以在 http://domi.sourceforge.net. 找到它。
-2
Ryan D. Hatch
17 年前
正在尋找 php_xsl.dll 嗎?

如果您是使用 MSI 安裝程式在 Windows 上安裝的 - 您可能沒有它。

1.) 新增/移除程式並變更 PHP 安裝。選取 XSL 擴充功能。



2.) 下載 PHP 的完整 .zip 檔案,您可以將 php_xsl.dll 複製到您的 PHP/etc 目錄中。

僅供參考。

Ryan D. Hatch
-2
shangxiao at php dot net
16 年前
當使用 DOM API 動態將 XSL 命令新增至樣式表時,請務必使用 createElementNS() 而非 createElement(),否則 XSLTProcessor 將無法辨識這些 DOM 節點。

例如
$xsl->createElementNS('http://www.w3.org/1999/XSL/Transform', 'xsl:element');
-3
allens at nospam dot com
15 年前
問題
取得 Netbeans 錯誤訊息
Fatal error: Class 'xsltprocessor' not found

解決方案
將 php.ini 的副本放置在 c:\windows 目錄中!

預設情況下,php.ini 檔案已停用 XSL......搜尋該行

;extension=php_xsl.dll

要啟用 XSL....請移除 ; 以便包含該擴充功能

然後,如果 Netbeans 出現以下訊息
PHP Startup:無法載入動態連結程式庫 './php_xsl.dll'

那麼您需要再次執行 php-5.2.9-1-win32-installer.msi
這次請選取 XSL 擴充功能!
To Top