2010-07-31 130 views
2

我这个XML代码:访问XML的XSL属性

<title xml:lang="ar">أربيك</title> 
<title xml:lang="en">English</title> 

我在XSL格式我:

<div class="title"> 
     <xsl:value-of select="root/title"/> 
</div> 

然而,这仅^显示阿拉伯语标题,而不是英语一个。我试过这个代码:

<div class="title"> 
     <xsl:attribute name="xml:lang"><xsl:value-of select="root/title"/> </xsl:attribute> 
</div> 

但是,这个^代码,它根本不显示标题。显示英文和阿拉伯文标题的正确方法是什么?

+2

一个浓缩的,自包含的,可复制和可复制的例子会很好(即,我们复制整个代码,执行它并查看问题)。 – VolkerK 2010-07-31 19:11:16

+0

好问题(+1)。看到我的答案是一个简单而完整的解决方案。 – 2010-07-31 21:10:53

+0

我认为你的第一次尝试是朝着正确的方向发展。检查我的答案,看看它是如何正确完成的。 – 2010-08-02 19:29:38

回答

5

以下将工作。

源XML:

$xmlDoc = <<< XML 
<titles> 
    <title xml:lang="ar">أربيك</title> 
    <title xml:lang="en">English</title> 
</titles> 
XML; 

XSL样式表与模板文件

$xslDoc = <<< XSL 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
      <h1>Titles</h1> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="title"> 
     <div class="{@xml:lang} title"> 
      <xsl:value-of select="."/> 
     </div> 
    </xsl:template> 

</xsl:stylesheet> 
XSL; 

与转型匹配任何标题节点与PHP:

$xml = new DOMDocument(); 
$xml->loadXML($xmlDoc); 
$xsl = new DOMDocument; 
$xsl->loadXML($xslDoc); 
$proc = new XSLTProcessor; 
$proc->importStyleSheet($xsl); 
echo $proc->transformToXML($xml); 

会给:

<?xml version="1.0"?> 
<h1>Titles</h1> 
    <div class="ar title">أربيك</div> 
    <div class="en title">English</div> 

编辑:修改后的标题模板使用xml:lang属性作为类属性,因此您可以使用CSS对其进行设置。如果您需要更复杂的样式,请编写与该属性相匹配的另一个模板(如Volker所示)。

+0

给出同样的错误警告:XSLTProcessor :: importStylesheet():元素模板只允许作为样式表的子元素 – input 2010-07-31 18:57:45

+2

...如果您已复制并粘贴Gordon的示例 - 其中