【问题标题】:Retrieve all the attribute values from XML using XSLT使用 XSLT 从 XML 中检索所有属性值
【发布时间】:2013-05-15 15:40:41
【问题描述】:

我不知道如何从 XML 文档中访问标记中的所有属性。

假设我有以下 XML:

<names>
  <name firstname="Rocky" lastname="Balboa" divider=", "/>
  <name firstname="Ivan" lastname="Drago" divider=", "/>
</names>

我想要以下输出: Rocky Balboa, Ivan Drago,

我目前拥有的是:

<xsl:for-each select="names/name">
   <xsl:value-of select="@firstname"/>
   <xsl:value-of select="@lastname"/>
   <xsl:value-of select="@divider"/>
</xsl:for-each>

我想知道的是,是否可以仅在一个 value-of 选择中执行此操作,而不必执行其中三个。所以为了澄清,我希望能够用一个单一的选择值输出标签中的所有属性。这可能吗?

谢谢。

【问题讨论】:

  • 您可以使用这个 XPath @* 来获取所有属性,例如:
  • 请考虑转让。由于奇怪的原因,我的格式无法正常工作。
  • 好吧,我想你也可以这样做。但我想弄清楚如何/是否可以按照我的方式做到这一点,但只有一个选择值。
  • 这就是我提到的。如果您参考上面的示例 @* 使用,您会看到它只需要一个选择值,您会很好。我希望这有帮助。我在下面用更好的缩进和格式重新发布我的评论。锄头会有所帮助。
  • 您希望如何处理空白。这在您当前的解决方案 中甚至都不合理。 (你是一代RockyBalboa, IvanDrago, 。)

标签: xml xslt value-of


【解决方案1】:

尝试以下方法:

<xsl:template match="/">
 <xsl:for-each select="names/name/@*">
        <xsl:value-of select="concat( ., ' ')"/>
  </xsl:for-each>
</xsl:template>     

【讨论】:

  • Lolz - 在 2019 年投票支持有关 XSLT 的答案 - 这很好用!
【解决方案2】:

因为我不确定xsl:value-of 的使用是否是一项硬性要求,所以您锁定的可能是以下内容。

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

    <xsl:template match="name" mode ="print" >
        <xsl:value-of select="@firstname"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="@lastname"/>
        <xsl:value-of select="@divider"/>
    </xsl:template>

    <xsl:template match="/">
        <xsl:apply-templates  select="names/name" mode="print"/>
    </xsl:template>

</xsl:stylesheet>

您可以使用&lt;xsl:apply-templates select="names/name" mode="print"/&gt; 在您考虑过对所有属性使用单行值的任何位置。
上述模板将生成以下输出:

Rocky Balboa, Ivan Drago,

在不使用属性名称的情况下更新 crate 输出:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>

    <xsl:template match="name" mode ="print" >
        <xsl:for-each select="@*" >
            <xsl:if test="not(position() = last() or position() = 1)">
                <xsl:text> </xsl:text>
            </xsl:if>
            <xsl:value-of select="."/>

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

    <xsl:template match="/">
        <xsl:apply-templates  select="names/name" mode="print"/>
    </xsl:template>

</xsl:stylesheet>

【讨论】:

    【解决方案3】:

    您可以使用此 XPath @* 来获取所有属性,例如:

    <xsl:template match="/*">
        <xsl:for-each select="@*">
            <xsl:value-of select="concat(name(), ': ', ., ' ')"/>
        </xsl:for-each>
    </xsl:template>
    

    这将让您只使用一个 value-of select 来获得您想要的输出。它将考虑所有属性。

    这应该足以让您弄清楚事情了。如果您还有其他问题,请告诉我。

    【讨论】:

    • 这个和请求关系不大。您正在生成类似firstname: Ivan lastname:...(如果有的话)的东西。但要求的是:Rocky Balboa, Ivan Drago,
    【解决方案4】:

    如果您可以使用 XSLT 2.0,您可以执行以下操作:

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="text"/>
    
        <xsl:template match="text()"/>
    
        <xsl:template match="*[@*]">
            <xsl:value-of select="@*[not(name()='divider')]" separator=" "/>
            <xsl:value-of select="@divider"/>           
            <xsl:apply-templates/>
        </xsl:template>
    
    </xsl:stylesheet>
    

    这将输出所有属性,并且您无法控制顺序,因此如果要指定顺序,可以使用序列:

    <xsl:value-of select="(@firstname,@lastname)" separator=" "/>
    

    或使用xsl:sort 执行xsl:apply-templates 以按name()(或其他)对属性进行排序。如果你想要一个例子,请告诉我。

    【讨论】:

    • 我一定是自己解释错了。我想知道是否可以打印出所有属性,而不是调用属性的名称。类似于 value-of select "*" 或类似的东西。
    • @ErikÅstrand - 这就是&lt;xsl:value-of select="@*[not(name()='divider')]" separator=" "/&gt; 所做的,只是它忽略了divider 属性。您也可以使用&lt;xsl:value-of select="@*" separator=" "/&gt;,但不能保证divider 将是最后一个输出。
    【解决方案5】:

    以下在 XSLT 2.0 中有效:

    <xsl:for-each select="names/name">
       <xsl:value-of select="@firstname, @lastname, @divider"/>
    </xsl:for-each>
    

    在 3.0 中你可以这样做:

    <xsl:value-of select="names/name!(@firstname, @lastname, @divider)"/>
    

    尽管您可能需要进行调整以按照您想要的方式获得空白。

    【讨论】:

    • 嘿。谢谢回复。我并不真正想知道如何通过调用属性的实际名称来打印出一行中的所有属性。我正在寻找一种方法来简单地调用所有属性,而不管名称如何。沿着这些思路:value-of select = " * "。可以打印所有属性的东西,但不能单独调用它们。
    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2013-03-30
    相关资源
    最近更新 更多