选择的XSLT输出值不正确

时间:2014-01-24 08:32:35

标签: xslt xslt-2.0

我的template_1.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<DSExport>
<TableDefinitions>
<Property Name="Category">\Table Definitions\Teradata\XML_TEST</Property>
   <Property Name="ShortDesc">Imported from: SRC_COLUMN_ADD_TEST</Property>
     <Collection Name="Columns" Type="MetaColumn">
        <SubRecord>
           <Property Name="Name">CUST_ID_1</Property>
           <Property Name="Description">CUST_ID: nullable int32</Property>
           <Property Name="SqlType">4</Property>
           <Property Name="Precision">9</Property>
           <Property Name="Scale">0</Property>
           <Property Name="Nullable">1</Property>
        </SubRecord>
        <SubRecord>
           <Property Name="Name">DESCR</Property>
           <Property Name="Description">DESCR: nullable string[max=144]</Property>
           <Property Name="SqlType">12</Property>
           <Property Name="Precision">144</Property>
           <Property Name="Scale">0</Property>
           <Property Name="Nullable">1</Property>
         </SubRecord>
        <SubRecord>
           <Property Name="Name">CUST_ADDR</Property>
           <Property Name="Description">CUST_ADDR: string[max=500]</Property>
           <Property Name="SqlType">12</Property>
           <Property Name="Precision">500</Property>
           <Property Name="Scale">0</Property>
           <Property Name="Nullable">0</Property>
        </SubRecord>
        <SubRecord>
           <Property Name="Name">AGE</Property>
           <Property Name="Description">AGE: nullable int32</Property>
           <Property Name="SqlType">4</Property>
           <Property Name="Precision">9</Property>
           <Property Name="Scale">0</Property>
           <Property Name="Nullable">1</Property>
        </SubRecord>
     </Collection>

     嗨,我是XSLT的新手,我尝试了很多,如下所述得到我的预期,一些如何从相同元素的相同属性值得到结果,请帮助...谢谢

我的template.xsl文件

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
    <DSExport>
        <id-of>
            <xsl:for-each select="//SubRecord">
                <SubRecord>
                <xsl:value-of select="//SubRecord/Property[@Name]" />
                </SubRecord>
            </xsl:for-each>
        </id-of>
    </DSExport>
</xsl:template>
</xsl:stylesheet>

我当前的输出:output.xml

<?xml version="1.0" encoding="UTF-8"?>
<DSExport>
<id-of>
    <SubRecord>CUST_ID_1</SubRecord>
    <SubRecord>CUST_ID_1</SubRecord>
    <SubRecord>CUST_ID_1</SubRecord>
    <SubRecord>CUST_ID_1</SubRecord>
</id-of>
</DSExport>

我的预期输出:

<?xml version="1.0" encoding="UTF-8"?>
<DSExport>
<id-of>
    <SubRecord>CUST_ID_1</SubRecord>
    <SubRecord>DESCR</SubRecord>
    <SubRecord>CUST_ADDR</SubRecord>
    <SubRecord>AGE</SubRecord>
</id-of>
</DSExport>

1 个答案:

答案 0 :(得分:1)

你的问题在于这个表达式

<xsl:value-of select="//SubRecord/Property[@Name]" />

xpath表达式开头的第一个斜杠表示它是一个绝对路径,因此它将从document元素开始搜索。然后两个斜杠表示它将在文档的任何级别搜索 SubRecord 元素。这导致它总是在XML中找到第一个 SubRecord 元素,无论您当前在哪里定位。

您需要在此处使用相对表达式。它将与您当前所在的上下文节点相关(这是一个 SubRecord 元素)。尝试用这个

替换它
<xsl:value-of select="Property[@Name]" />

请注意,严格来说,这将获得第一个属性元素,该元素具有名称属性。虽然这给出了你期望的结果,但也许最好写成这个

<xsl:value-of select="Property[@Name='Name']" />

即。获取属性,其名称属性的值为名称