首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT:将标记的所有属性传递给php函数

XSLT:将标记的所有属性传递给php函数
EN

Stack Overflow用户
提问于 2011-10-07 02:14:14
回答 2查看 302关注 0票数 4

我已经编写了以下XSLT模板:

代码语言:javascript
复制
<xsl:template match="foo:*">
    <xsl:processing-instruction name="php">$s = ob_get_clean(); ob_start(); $this->callExtensionStartHandler('<xsl:value-of select="local-name()" />');</xsl:processing-instruction>
    <xsl:apply-templates/>
    <xsl:processing-instruction name="php">$sExtensionContent = ob_get_clean(); ob_start(); echo $s; echo $this->callExtensionEndHandler('<xsl:value-of select="local-name()" />', $sExtensionContent);</xsl:processing-instruction>
</xsl:template>

现在,我希望将标记的所有属性及其值传递给php函数。如果我有一个模板:

代码语言:javascript
复制
<foo:test id="a" bar="xzz"/>

我希望在我的php函数中有一个数组(‘id’=> 'a','bar‘=> 'xzz')。有没有可能。我不想限制属性的名称,所以可以有任何属性名称。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-07 13:21:30

我不熟悉PHP,但这可能会有帮助:

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:foo="foo:foo">
 <xsl:output method="text"/>

 <xsl:template match="foo:test">
  array(<xsl:apply-templates select="@*"/>)
 </xsl:template>

 <xsl:template match="foo:test/@*">
  <xsl:if test="not(position()=1)">, </xsl:if>
  <xsl:value-of select=
  'concat(&quot;&apos;&quot;,name(),&quot;&apos;&quot;,
          " => ",
          &quot;&apos;&quot;,.,&quot;&apos;&quot;)'/>
 </xsl:template>
</xsl:stylesheet>

在此文档(所提供的文档格式良好)上应用此转换时:

代码语言:javascript
复制
<foo:test id="a" bar="xzz" xmlns:foo="foo:foo"/>

生成所需的正确结果

代码语言:javascript
复制
  array('id' => 'a', 'bar' => 'xzz')

更新:在评论中,操作员询问:

谢谢你,看起来很棒!是否可以向属性值添加转义?每一个“应该成为\”

Answer:可以,我们可以通过稍微修改原始解决方案来获得以下输出:

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:foo="foo:foo">
 <xsl:output method="text"/>

 <xsl:template match="foo:test">
  array(<xsl:apply-templates select="@*"/>)
 </xsl:template>

 <xsl:template match="foo:test/@*">
  <xsl:if test="not(position()=1)">, </xsl:if>
  <xsl:value-of select=
  'concat(&quot;\&quot;,&quot;&apos;&quot;,name(),&quot;\&quot;,&quot;&apos;&quot;,
          " => ",
          &quot;\&quot;,&quot;&apos;&quot;,.,&quot;\&quot;,&quot;&apos;&quot;)'/>
 </xsl:template>
</xsl:stylesheet>

当应用于同一文档时,此转换将生成

代码语言:javascript
复制
  array(\'id\' => \'a\', \'bar\' => \'xzz\')
票数 1
EN

Stack Overflow用户

发布于 2011-10-07 02:51:57

难道不能只传递元素本身,然后使用适当的php函数获取所有属性吗?这样您就不需要关心属性的名称了,因为我确信有一种方法可以遍历php中元素的所有属性:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7678653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档