【问题标题】:XSLT or PHP hyperlink delete elementXSLT 或 PHP 超链接删除元素
【发布时间】:2013-01-02 00:42:16
【问题描述】:

我的 XML 文件的 sn-p:

<list>
  <info>
    <title>My Title</title>
    <blah>My Blah</blah>
    <derp>My Derp</derp>
  </info>
  <info>
    <title>Second Title</title>
    <blah>My Blah2</blah>
    <derp>My 2nd Derp</derp>
  </info>
  <info>
    <title>123</title>
    <blah>444</blah>
    <derp>zzz</derp>
  </info>
</list>

我的 XSLT 文件的片段:

<xsl:for-each select="info">
<tr>
    <td><xsl:value-of select="title" /></td>
    <td><xsl:value-of select="blah" /></td>
    <td><xsl:value-of select="derp" /></td>
</tr>
</xsl:for-each>

当我在 PHP 中使用 XSLTProcessor 时,这基本上会在一个整洁的表格中将我的 info 元素的标题、blah 和 derp 显示在他们自己的行中。

但无论如何,我想要做的是在我的表格中的每一行元素中都有一个 X 按钮。当单击此 X 按钮时,整个相应的 &lt;info&gt; 元素将从 XML 文件中删除。问题是我不知道从哪里开始这样做。我不知道是否可以使用 XSL 重写 XML 文件,或者我必须在 PHP 中重写。

感谢您的帮助。

【问题讨论】:

  • &lt;xsl:value-of select="position()" /&gt; 是否输出信息元素的编号,例如 1、2 或 3?
  • 是的。但它可能是倒退的,因为我的 XSL 中也有 &lt;xsl:sort select="position()" data-type="number" order="descending"/&gt; 以按保留顺序显示表格。所以 123,444,zzz 将在顶部而不是底部。
  • 用链接存储那个号码。单击时,您可以通过 xpath 选择要删除的元素:例如info[2]。这能解决您的问题吗?
  • 好主意。我能够想出&lt;a&gt;&lt;xsl:attribute name="href"&gt;&lt;xsl:value-of select="position()" data-type="number" order="ascending" /&gt;&lt;/xsl:attribute&gt;X&lt;/a&gt;,它将在链接中包含值编号。但是我不明白您使用 xpath 删除相应的 info 元素是什么意思。我需要为此使用 XSL 还是 PHP?

标签: php xml xslt


【解决方案1】:

如何按位置删除 XML 文档中的元素。

正如所写,您可以使用 Xpath 表达式来查询要删除的元素,然后删除它们。

以下是一个快速的 PHP 示例,它有点扩展,因为它还删除了元素后面的文本(在您的文档中的空白)作为奖励。这再次展示了如何使用位置谓词:

$doc = new DOMDocument();
$doc->loadXML($xml);
$xp = new DOMXPath($doc);

$expression = '

    /list/info[2]   |  /list/info[2]/following-sibling::text()[1]
                                                                    ';
//   the element,          the whitespace after the element,
//   numbered              again numbered. just to clean up a bit
//                         and to give another example

$delete = $xp->query($expression);
foreach($delete as $element) {
    $element->parentNode->removeChild($element);
}

echo $doc->saveXML();

然后结果看起来像 (Online Demo):

<?xml version="1.0"?>
<list>
  <info>
    <title>My Title</title>
    <blah>My Blah</blah>
    <derp>My Derp</derp>
  </info>
  <info>
    <title>123</title>
    <blah>444</blah>
    <derp>zzz</derp>
  </info>
</list>

我希望这会有所帮助。

我最近也在answer to select only one node and move on php 中写过有关编号谓词的文章。也许它会散发出更多的光芒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    相关资源
    最近更新 更多