Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用xslt在xml文件中查找特定元素_Xml_Xslt_Xpath - Fatal编程技术网

使用xslt在xml文件中查找特定元素

使用xslt在xml文件中查找特定元素,xml,xslt,xpath,Xml,Xslt,Xpath,我有多个xml文件要处理并写入一个xml文件。我已经完成了大部分转换,并在一个xml文件中找到了一个特定元素 其中一个源xml是(parts.xml): 另一个源xml(price.xml): 主轴 28.45 ... ... 我必须只获取属于特定name元素的code元素。 这只是一个源xml文件,像这样我有很多要处理 我的输出xml必须如下所示(result.xml): ... 获取部件代码的xslt函数是: <xsl:function name="p:find">

我有多个xml文件要处理并写入一个xml文件。我已经完成了大部分转换,并在一个xml文件中找到了一个特定元素

其中一个源xml是(parts.xml):

另一个源xml(price.xml):


主轴
28.45
...
...
我必须只获取属于特定name元素的code元素。 这只是一个源xml文件,像这样我有很多要处理

我的输出xml必须如下所示(result.xml):


...
获取部件代码的xslt函数是:

<xsl:function name="p:find">
    <xsl:variable name="partdoc" select="document('parts.xml')"/>
    <xsl:param name="str"/>
    <xsl:apply-templates select="$partdoc/p:/parts/part[contains(p:name,  '$str')]"/>
    <xsl:apply-templates select="$partdoc/p:code" />
</xsl:function> 

最后,我想这样调用函数:

<xsl:template match="/">
    <xsl:copy>
        <xsl:variable name="code">
            <xsl:value-of select="p:find('head shaft')"/>
        </xsl:variable>
        <part code="{'$code'}" name="{'head shaft'}" price="{$somelogic}"/>                     
    </xsl:copy>
</xsl:template>

它不工作,因为我在函数声明中犯了一些错误。请提供帮助。

定义一个键
,然后使用全局参数或变量
,然后可以使用

没有必要为交叉引用编写函数,因为键提供了交叉引用

这是一个完整的示例,主要输入文档是

<?xml version="1.0" encoding="UTF-8"?>
<price-list>
    <price>
        <part-name>head shaft</part-name>
        <cost>28.45</cost>
        ...
    </price>
    ...
</price-list>
考虑到XSLT

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

    <xsl:key name="part-ref" match="parts/part" use="name"/>

    <xsl:variable name="partdoc" select="document('parts.xml')"/>

    <xsl:template match="price-list">
        <part-order>
            <xsl:apply-templates/>
        </part-order>
    </xsl:template>

    <xsl:template match="price">
        <part code="{key('part-ref', part-name, $partdoc)/code}" name="{part-name}" price="{cost}" qty="1" />
    </xsl:template>

</xsl:stylesheet>

输出是

<part-order>
    <part code="100" name="head shaft" price="28.45" qty="1"/>
    ...
</part-order>

...

是否可以调用键中的文档引用?当我试图调用它时,它没有显示任何结果。键('part-ref'、'head shaft'、$partdoc)/code@SrikrishnaPothukuchi,我用一个对我来说很好的完整示例编辑了答案。如果您仍然有问题,请编辑您的问题,显示最小但完整的XML示例、您现在拥有的XSLT、您获得的输出以及有关所用XSLT处理器的信息。非常感谢。正如你正确地指出的,这是我的日食的问题。我正在使用萨克森9.7和Eclipse Neon。有时它的行为是不正确的。当我使用XMLSpear时,同样的代码能够100%准确地工作。再次感谢Martin。我将这些键合并到主应用程序中,它工作得很好。顺致敬意,
<?xml version="1.0" encoding="UTF-8"?>
<price-list>
    <price>
        <part-name>head shaft</part-name>
        <cost>28.45</cost>
        ...
    </price>
    ...
</price-list>
<?xml version="1.0" encoding="UTF-8"?>
<parts>
    <part>
        <name>head shaft</name>
        <code>100</code>
    </part>
    ...
</parts>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:key name="part-ref" match="parts/part" use="name"/>

    <xsl:variable name="partdoc" select="document('parts.xml')"/>

    <xsl:template match="price-list">
        <part-order>
            <xsl:apply-templates/>
        </part-order>
    </xsl:template>

    <xsl:template match="price">
        <part code="{key('part-ref', part-name, $partdoc)/code}" name="{part-name}" price="{cost}" qty="1" />
    </xsl:template>

</xsl:stylesheet>
<part-order>
    <part code="100" name="head shaft" price="28.45" qty="1"/>
    ...
</part-order>