使用XSLT使用属性值更改现有元素名称

时间:2012-12-07 17:43:26

标签: xml xslt

我有一个XML文件,它使用非常通用的XML标记名称,但具有丰富的属性结构,例如: <Field Name="CRSDESC1" FieldName="{@CRS_DESC}"><FormattedValue>Survey of Human Anatomy and Physiology</FormattedValue></Field>

我想通过使用“Name”属性更改现有的元素名称,如下所示:     <CRSDESC1>Survey of Human Anatomy and Physiology</CRSDESC1>

创建新元素后,我们不再需要元素<FormattedValue>,也不需要重复<Value>

以下是XML的示例部分:

<CrystalReport> <ReportHeader><Details Level="1"> <Section SectionNumber="0"> <Field Name="CRSDESC1" FieldName="{@CRS_DESC}"><FormattedValue>Heating and Air Contracting</FormattedValue><Value>Heating and Air Contracting</Value></Field> <Field Name="CRSTITLE1" FieldName="{@CRS_TITLE}"><FormattedValue>Heating and Air Conditioning Contracting</FormattedValue><Value>Heating and Air Conditioning Contracting</Value></Field> <Field Name="CRSDEPTS1" FieldName="{Command.CRS_DEPTS}"><FormattedValue>AIRC</FormattedValue><Value>AIRC</Value></Field> <Field Name="DEPTSDESC1" FieldName="{Command.DEPTS_DESC}"><FormattedValue>Heating, A/C &amp; Refrigeration</FormattedValue><Value>Heating, A/C &amp; Refrigeration</Value></Field> <Field Name="CRSNO1" FieldName="{Command.CRS_NO}"><FormattedValue>2260</FormattedValue><Value>2260</Value></Field> <Field Name="CRSSTANDARDARTICULATIONNO1" FieldName="{Command.CRS_STANDARD_ARTICULATION_NO}"><FormattedValue></FormattedValue><Value></Value></Field> <Field Name="CRSMINCRED1" FieldName="{Command.CRS_MIN_CRED}"><FormattedValue>3.00</FormattedValue><Value>3.00</Value></Field> </Section> </Details> <Details Level="1"> <Section SectionNumber="0"> <Field Name="CRSDESC1" FieldName="{@CRS_DESC}"><FormattedValue>Survey of Human Anatomy and Physiology</FormattedValue><Value>Survey of Human Anatomy and Physiology</Value></Field> <Field Name="CRSTITLE1" FieldName="{@CRS_TITLE}"><FormattedValue>Survey of Human Anatomy and Physiology</FormattedValue><Value>Survey of Human Anatomy and Physiology</Value></Field> <Field Name="CRSDEPTS1" FieldName="{Command.CRS_DEPTS}"><FormattedValue>ANAT</FormattedValue><Value>ANAT</Value></Field> <Field Name="DEPTSDESC1" FieldName="{Command.DEPTS_DESC}"><FormattedValue>Anatomy &amp; Physiology</FormattedValue><Value>Anatomy &amp; Physiology</Value></Field> <Field Name="CRSNO1" FieldName="{Command.CRS_NO}"><FormattedValue>1500</FormattedValue><Value>1500</Value></Field> <Field Name="CRSSTANDARDARTICULATIONNO1" FieldName="{Command.CRS_STANDARD_ARTICULATION_NO}"><FormattedValue>L1 904L</FormattedValue><Value>L1 904L</Value></Field> <Field Name="CRSMINCRED1" FieldName="{Command.CRS_MIN_CRED}"><FormattedValue>4.00</FormattedValue><Value>4.00</Value></Field> </Section> </Details> <ReportHeader><CrystalReport>

1 个答案:

答案 0 :(得分:2)

这样可行......

XML输入(已更正为格式良好)

<CrystalReport>
    <ReportHeader>
        <Details Level="1">
            <Section SectionNumber="0">
                <Field Name="CRSDESC1" FieldName="{@CRS_DESC}">
                    <FormattedValue>Heating and Air Contracting</FormattedValue>
                    <Value>Heating and Air Contracting</Value>
                </Field>
                <Field Name="CRSTITLE1" FieldName="{@CRS_TITLE}">
                    <FormattedValue>Heating and Air Conditioning Contracting</FormattedValue>
                    <Value>Heating and Air Conditioning Contracting</Value>
                </Field>
                <Field Name="CRSDEPTS1" FieldName="{Command.CRS_DEPTS}">
                    <FormattedValue>AIRC</FormattedValue>
                    <Value>AIRC</Value>
                </Field>
                <Field Name="DEPTSDESC1" FieldName="{Command.DEPTS_DESC}">
                    <FormattedValue>Heating, A/C &amp; Refrigeration</FormattedValue>
                    <Value>Heating, A/C &amp; Refrigeration</Value>
                </Field>
                <Field Name="CRSNO1" FieldName="{Command.CRS_NO}">
                    <FormattedValue>2260</FormattedValue>
                    <Value>2260</Value>
                </Field>
                <Field Name="CRSSTANDARDARTICULATIONNO1" FieldName="{Command.CRS_STANDARD_ARTICULATION_NO}">
                    <FormattedValue/>
                    <Value/>
                </Field>
                <Field Name="CRSMINCRED1" FieldName="{Command.CRS_MIN_CRED}">
                    <FormattedValue>3.00</FormattedValue>
                    <Value>3.00</Value>
                </Field>
            </Section>
        </Details>
        <Details Level="1">
            <Section SectionNumber="0">
                <Field Name="CRSDESC1" FieldName="{@CRS_DESC}">
                    <FormattedValue>Survey of Human Anatomy and Physiology</FormattedValue>
                    <Value>Survey of Human Anatomy and Physiology</Value>
                </Field>
                <Field Name="CRSTITLE1" FieldName="{@CRS_TITLE}">
                    <FormattedValue>Survey of Human Anatomy and Physiology</FormattedValue>
                    <Value>Survey of Human Anatomy and Physiology</Value>
                </Field>
                <Field Name="CRSDEPTS1" FieldName="{Command.CRS_DEPTS}">
                    <FormattedValue>ANAT</FormattedValue>
                    <Value>ANAT</Value>
                </Field>
                <Field Name="DEPTSDESC1" FieldName="{Command.DEPTS_DESC}">
                    <FormattedValue>Anatomy &amp; Physiology</FormattedValue>
                    <Value>Anatomy &amp; Physiology</Value>
                </Field>
                <Field Name="CRSNO1" FieldName="{Command.CRS_NO}">
                    <FormattedValue>1500</FormattedValue>
                    <Value>1500</Value>
                </Field>
                <Field Name="CRSSTANDARDARTICULATIONNO1" FieldName="{Command.CRS_STANDARD_ARTICULATION_NO}">
                    <FormattedValue>L1 904L</FormattedValue>
                    <Value>L1 904L</Value>
                </Field>
                <Field Name="CRSMINCRED1" FieldName="{Command.CRS_MIN_CRED}">
                    <FormattedValue>4.00</FormattedValue>
                    <Value>4.00</Value>
                </Field>
            </Section>
        </Details>
    </ReportHeader>
</CrystalReport>

XSLT 1.0

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

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

    <xsl:template match="Field[@Name]">
        <xsl:element name="{@Name}">
            <xsl:value-of select="FormattedValue"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

XML输出

<CrystalReport>
   <ReportHeader>
      <Details Level="1">
         <Section SectionNumber="0">
            <CRSDESC1>Heating and Air Contracting</CRSDESC1>
            <CRSTITLE1>Heating and Air Conditioning Contracting</CRSTITLE1>
            <CRSDEPTS1>AIRC</CRSDEPTS1>
            <DEPTSDESC1>Heating, A/C &amp; Refrigeration</DEPTSDESC1>
            <CRSNO1>2260</CRSNO1>
            <CRSSTANDARDARTICULATIONNO1/>
            <CRSMINCRED1>3.00</CRSMINCRED1>
         </Section>
      </Details>
      <Details Level="1">
         <Section SectionNumber="0">
            <CRSDESC1>Survey of Human Anatomy and Physiology</CRSDESC1>
            <CRSTITLE1>Survey of Human Anatomy and Physiology</CRSTITLE1>
            <CRSDEPTS1>ANAT</CRSDEPTS1>
            <DEPTSDESC1>Anatomy &amp; Physiology</DEPTSDESC1>
            <CRSNO1>1500</CRSNO1>
            <CRSSTANDARDARTICULATIONNO1>L1 904L</CRSSTANDARDARTICULATIONNO1>
            <CRSMINCRED1>4.00</CRSMINCRED1>
         </Section>
      </Details>
   </ReportHeader>
</CrystalReport>