使用XSLT 2.0将任意属性的值替换为元素的内容

时间:2014-06-29 04:18:47

标签: xml xslt xslt-2.0

如果elemnt具有此属性,我需要使用任意属性的值替换元素的内容。我需要使用XSLT表(2.0),但我不知道如何做这样的事情。

例如,假设我有这个xml文档。

<?xml version="1.0" encoding="UTF-8"?>
<document> 
  Hi my name is <tag-A flag="Bob">Leopold</tag-A>
  and I'm fond of <tag-B flag="coding">literature</tag-B>
  unless in the <tag-C whatever="evening">morning</tag-C>
</document>

然后xslt将更改具有flag属性的任何元素的内容,例如,对于该属性的值,并将所有内容括在<p>标记中。这是我在那种情况下得到的输出。

<p>Hi my name is Bob
and I'm fond of coding
unless in the morning</p>

我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

这会产生您一直要求的输出:

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

<xsl:output method="xml" indent="yes"/>

<xsl:template match = "document">
  <p><xsl:apply-templates select="node()"/>
  </p>
</xsl:template>

<xsl:template match = "*[@flag]">
  <xsl:value-of select="@flag"/>
</xsl:template>

</xsl:stylesheet>

请注意@whatever被忽略了,但可以轻松折叠。

此外,我认为您对使用&lt; p&gt;的文档感到满意。作为最外层的元素?

答案 1 :(得分:0)

注意:不清楚你的意思是问题标题是“任意”,然后问题中的文字说“flag”属性。如果您的XML仅作为show而您想要替换为任何属性并且您只有一个,那么您可以这样做(只需要XSL 1.0):

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

    <xsl:template match="document">
       <p>
        <xsl:apply-templates/>
       </p>
    </xsl:template>
    <xsl:template match="node()">
        <xsl:apply-templates select="@*"/>
    </xsl:template>

    <xsl:template match="text()">
        <xsl:copy/>
    </xsl:template>
    </xsl:stylesheet>

XML的输出是:

<p> 
Hi my name is Bob
and I'm fond of coding
unless in the evening
</p>