我无法弄清楚如何从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>
我想知道的是,是否可以只选择一个值而不是必须执行其中三个。因此,为了澄清,我希望能够使用一个select值输出标记中的所有属性。这可能吗?
感谢。
答案 0 :(得分:3)
因为我不确定使用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>
您可以使用<xsl:apply-templates select="names/name" mode="print"/>
在您考虑过使用所有属性的单行值的任何位置
以上模板将生成以下输出:
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>
答案 1 :(得分:1)
尝试以下方法:
<xsl:template match="/">
<xsl:for-each select="names/name/@*">
<xsl:value-of select="concat( ., ' ')"/>
</xsl:for-each>
</xsl:template>
答案 2 :(得分:0)
您可以使用此XPath @ *获取所有属性,例如:
<xsl:template match="/*">
<xsl:for-each select="@*">
<xsl:value-of select="concat(name(), ': ', ., ' ')"/>
</xsl:for-each>
</xsl:template>
这将让您只使用一个select值来获得所需的输出。它将考虑所有属性。
这应该是你弄清楚事情的充分暗示。如果您有任何其他问题,请与我们联系。
答案 3 :(得分:0)
如果您可以使用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:apply-templates
执行xsl:sort
以按name()
(或其他)对属性进行排序。如果你想要一个例子,请告诉我。
答案 4 :(得分:0)
以下适用于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)"/>
虽然您可能需要进行调整以获得您想要的空格。