【问题标题】:XSLT1: Using xsl:element how to include current selection of attributesXSLT1:使用 xsl:element 如何包含当前选择的属性
【发布时间】:2020-09-02 22:39:48
【问题描述】:

我尝试使用 xsl:element 创建节点,以包含当前选择的所有属性。我认为应该很简单,但由于某种原因,我无法得到结果。

我隔离的情况下,有XML:

<?xml-stylesheet href="myfile.xsl" type="text/xsl" ?>
<a firstAtt="1" secondAtt="2">
    Some Text
</a>

我期待得到这个结果:

<a firstAtt="1" secondAtt="2"/>

有我的 XSLT 转换代码:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="*">
            <xsl:element name="{name()}" use-attribute-sets="{@*}"/>
    </xsl:template>
</xsl:stylesheet>

在没有深入研究的情况下,我对这种方法进行了大量尝试。 (包括xsl:for-eachxsl:attribute等)

我可以理解use-attribute-sets 不能那样工作(意味着在运行时定位到当前的属性集)。也许我错了。

这是为了评估,有一个限制是不能使用 xsl:copy。使它在 XSLT 1.0 中工作也有一个限制

我是 XML - XSL 的新手。如果有人可以提供帮助,请提前感谢您的理解。

【问题讨论】:

  • 如果您不能使用xsl:copy,则使用xsl:attribute 重新创建一个属性 - 与您对元素所做的一样。要重新创建所有属性,请将 xsl:for-eachxsl:apply-templates 与另一个匹配属性的模板一起使用。
  • 到底有谁安排任务编写代码时不是一只手而是两只手绑在背后? (或者是否允许xsl:copy-of?对于属性,复制和复制做同样的事情。)
  • 您好,非常感谢您的帮助。我们想通了。没有 xsl:copy 或 xsl:copy-of 也可以做到这一点。 (见皮埃尔的回答)我认为老师想把我们推到“训练台”上。现在我摆脱了卡住的位置。谢谢!!!

标签: xml xslt attributes xslt-1.0


【解决方案1】:

我不知道我是否正确理解“当前选择”的意思,但这个 XSL 样式表可以满足您的期望,至少对于您提供的输入:

<?xml version="1.0" encoding="utf-8"?>

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

  <xsl:output method="xml" indent="yes" encoding="utf-8"/>

  <xsl:template match="*">
    <xsl:element name="{name()}">
      <xsl:for-each select="@*">
        <xsl:attribute name="{name()}">
          <xsl:value-of select="."/>
        </xsl:attribute>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

【讨论】:

  • Bonjour Pierre,是的,这正是我想要做的。考虑到上面的其他 cmets,我又想通了,我得出了和你一样的结果。谢谢!!!
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 2011-02-18
  • 2010-11-23
  • 2021-11-02
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多