当XPath本身是节点内部的文本时,从节点获取值

| 简单的问题:我有一个像这样的XML文件:
<Locations>
    <Location>/Simulation/@ID</Location>
    <Location>/Simulation/Loans</Location>
    <Location>/Simulation/Assets</Location>
    <Location>/Simulation/BankAssets</Location>
    <Location>/Simulation/RealEstates</Location>
</Locations>
我还有另一个XML文件,其中包含与这些XPath节点匹配的数据。而且我需要创建一个XSLT 1.0,而没有任何脚本可以将该数据文件转换为仅生成与这些节点匹配的数据列表。像这样:
<Data>
    <Item Node=\"/Simulation/@ID\">
        <Value>1</Value>
        <Value>2</Value>
        <Value>3</Value>
    </Item>
    <Item Node=\"/Simulation/Loans\">
        <Value>1024</Value>
        <Value>555</Value>
        <Value>0</Value>
    </Item>
</Data>
每个项目的值节点的数量并不重要。不同项目的值之间的关系也不重要。基本上,样式表仅用于收集简单的统计数据,以进行汇总,平均和其他操作。 货车的位置列表变化很大,具体取决于用户的需求。这个例子只是一些欺骗数据。 问题:如何收集此信息?     
已邀请:
实际上,有两种方法可以执行此操作-一种是执行两相转换,另一种是使用“ 2”扩展函数。 两阶段转换 首先,您需要根据
Locations
列表生成正确的XSL。它可能看起来像这样:
<xsl:template match=\"/\">
    <Data>
        <Item Node=\"/Simulation/@ID\">
            <xsl:apply-templates select=\"/Simulation/@ID\"/>
        </Item>
        <Item Node=\"/Simulation/Loans\">
            <xsl:apply-templates select=\"/Simulation/Loans\"/>
        </Item>

        <!-- ... and so on ... -->

    </Data>
</xsl:template>

<xsl:template match=\"node()|@*\">
    <Value>
        <xsl:value-of select=\".\"/>
    </Value>
</xsl:template>
我假设您创建转换并不会很麻烦,该转换将基于您的XPath定义文件生成此输出,因为模式非常简单。 下一步是将生成的转换应用于源文件。您可以将这两个步骤组合成一个小管道,并获得所需的结果。 使用扩展功能 库EXSLT包含称为评估的扩展功能,在您的情况下有帮助。开箱即用的Xalan变压器支持它,但据我所知撒克逊人不支持。 但是,此功能存在一个主要问题-从Xalan 2.7版本开始,存在一个错误,阻止执行多次求值。不幸的是,当我尝试运行以下样式表时,它会受到影响。建议将Xalan的版本更改为2.6。不过,这是样式表,无需额外的生成阶段即可完成您想要的工作。
<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"
    xmlns:dyn=\"http://exslt.org/dynamic\" extension-element-prefixes=\"dyn\">

    <xsl:variable name=\"locations\" select=\"document(\'xpath.xml\')/Locations\"/>
    <xsl:variable name=\"root\" select=\"/\"/>

    <xsl:template match=\"/\">
        <Data>
            <xsl:for-each select=\"$locations/Location\">
                <Item Node=\"{.}\">
                    <xsl:variable name=\"currentLocation\" select=\"concat(\'$root\', .)\"/>
                    <xsl:apply-templates select=\"dyn:evaluate($currentLocation)\"/>
                </Item>
            </xsl:for-each>
        </Data>
    </xsl:template>

    <xsl:template match=\"node()|@*\">
        <Value>
            <xsl:value-of select=\".\"/>
        </Value>
    </xsl:template>

</xsl:stylesheet>
假设具有“位置”定义的文档位于同一目录中,称为“ 6”。如果不是这种情况,请更新
document()
函数的用法。     

要回复问题请先登录注册