XSLT和动态属性名称

时间:2015-01-08 06:49:45

标签: xml xslt

我有一些XML,我试图转换为更容易理解的XML文件。我遇到的问题是元素和属性名称在它们的末尾有数字。我能够得到第一级元素:

  <xsl:template match="*[starts-with(name(), 'node')]" name="reports">

我也可以为 section1 创建模板,但我不知道如何在模板中访问其region *属性。这就是原始XML的样本:

<node01>
  <report>
    <section1 region1="World">
      ...
    </section1>
    <section2 region2="EU">
      ...
    </section2>
  <report>
<node01>

我希望输出看起来像:

<reports>
  <report>
    <region>
      <name>World</name>
      ...
    </region>
    <region>
      <name>EU</name>
      ...
    </region>
  <report>
<reports>

1 个答案:

答案 0 :(得分:1)

不知道你在哪里坚持这个。这是你可以看到它的一种方式:

XSLT 1.0

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

<xsl:template match="/node01">
    <reports>
        <xsl:apply-templates/>
    </reports>
</xsl:template>

<xsl:template match="report">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*[starts-with(name(), 'section')]">
    <xsl:apply-templates select="@*"/>
</xsl:template>

<xsl:template match="@*[starts-with(name(), 'region')]">
    <region>
        <name><xsl:value-of select="."/></name>
    </region>
</xsl:template>

</xsl:stylesheet>

这是另一个:

XSLT 1.0

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

<xsl:template match="/*">
    <reports>
        <xsl:for-each select="report">
            <xsl:copy>
                <xsl:for-each select="*/@*">
                    <region>
                        <name><xsl:value-of select="."/></name>
                    </region>
                </xsl:for-each>
            </xsl:copy>
        </xsl:for-each>
    </reports>
</xsl:template>

</xsl:stylesheet>