【问题标题】:xsl gets attributes with dollar as php variablexsl 以美元作为 php 变量获取属性
【发布时间】:2012-07-20 06:31:20
【问题描述】:

我的 xsl 样式表工作得很好,除了我不能在我的样式表中使用属性的东西。但我真的需要他们来完成我的功能。

我在 php 中使用 xsl,当我尝试声明一个属性并使用时,xsl 认为 $attr 是一个 php 变量并且函数崩溃了。

这是我的代码

<?php
function releaseNotes($source, $type, $order_by, $sort) {

$type = $type ? "[@type='{$type}']" : "";

$xsl = <<<XSL
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="versions" match="issue" use="fix_versions"/>
<xsl:key name="type" match="issue" use="concat(fix_versions, '+', @type)"/>

  <xsl:template match="issues">



      <xsl:for-each select="//issue[generate-id(.)=generate-id(key('versions', fix_versions)[1])]">

        <xsl:sort select="fix_versions" order="descending"/> 

        <div class="release">

            <a href="" class="version"><xsl:value-of select="fix_versions"/></a>




            <xsl:attribute name="version"><xsl:value-of select="fix_versions"/></xsl:attribute>
            <xsl:value-of select="$version"/>
            <xsl:if test="//release[@version = '$version']">
              Yeah
            </xsl:if>



            <div class="version" style="display:none;">

            <xsl:for-each select="key('versions', fix_versions)">

                <xsl:for-each select="key('type', concat(fix_versions, '+', @type))">
                    <div style="border-bottom:1px solid grey;">
                    <a href="" class="title"><xsl:value-of select="title"/></a>
                    <div class="toggle" style="display:none;">
                        <xsl:value-of select="description"/>

                </div>
          </div>                        
            </xsl:for-each>

            </div>
       </div>
      </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>
XSL;

$xmldoc = new DOMDocument('1.0', 'utf-8');
$xmldoc->load($source);
$xsldoc = DOMDocument::loadXML($xsl);

$proc = new XSLTProcessor();
$proc->registerPHPFunctions();
$proc->importStyleSheet($xsldoc);
return $proc->transformToXML($xmldoc);
}
?>  

无论我在哪里尝试使用一个属性——只要我想使用它,我就再也得不到函数的结果了吗?任何的想法?

在这个例子中似乎没用,但我想检查是否有一个具有此版本号的节点“发布”,所以我需要获取当前字符串的版本作为属性。

xml结构是这样的

<release version="x.x.x" name="release1"/>
<release version="x.x.x" name="release2"/>
<release version="x.x.x" name="release3"/>
<issues>
  <issue><fix_versions>x.x.x</fix_versions></issue>
  <issue><fix_versions>x.x.x</fix_versions></issue>
  <issue><fix_versions>x.x.x</fix_versions></issue>
</issues>

只有已发布版本的问题应该可见。这就是为什么我必须检查是否存在具有相同版本的版本

一切正常,甚至分组,但属性。正如我所说,该函数将 $version 作为 php 变量而不是 aatribute 的名称。

提前致谢

【问题讨论】:

  • 您的样式表没有引用 $attr,那么您的问题是什么?你想插入一个属性——在哪里和什么值?您能否向我们展示一个示例输入文档及其预期输出?
  • 对不起。更新了第一个帖子。我认为这样就足够了,因为这是一个普遍的问题:) 我添加了一个示例和 xml 结构
  • 在你的样式表中 $version 没有引用任何东西。您还没有定义任何参数或变量称为版本。
  • 在您测试时,焦点节点也是问题节点,但您引用的版本不是问题的子节点。也许您试图引用输出树,而这在 XSLT 中是做不到的?
  • 还有你的listing以“The xml structure is like this..”开头,这是否意味着输入文档?如果是这样,您似乎忘记列出预期的输出。

标签: xml xslt xslt-1.0


【解决方案1】:

您的问题有点令人困惑,但如果您的意思是问题在于:

$type = $type ? "[@type='{$type}']" : "";

被翻译为 $type 是一个变量并被扩展,如果你在变量前面放一个 \ ,它会起作用,甚至是单引号:

$type = $type ? "[@type='{\$type}']" : "";
or 
$type = $type ? "[@type='".'{$type}'."']" : "";

【讨论】:

  • 哦,伙计们,我发现了我的错误,非常抱歉浪费了您的时间。我想要的是创建一个变量 - 而不是一个属性。已经很晚了,我在任何地方都读取了属性,并且从那里变量被我脑海中的属性所取代。真的很抱歉浪费了你的时间:(
  • 没问题。有时您只需说出问题所在,您自己就能看到答案。
猜你喜欢
  • 2011-03-04
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2014-05-04
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
相关资源
最近更新 更多