Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/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
Xml XSLT-我可以创建一个临时文档作为文档节点的存储库吗?_Xml_Xslt - Fatal编程技术网

Xml XSLT-我可以创建一个临时文档作为文档节点的存储库吗?

Xml XSLT-我可以创建一个临时文档作为文档节点的存储库吗?,xml,xslt,Xml,Xslt,假设我有以下临时文件: <xsl:variable name="emc"> <people> <person id="1"> <name>Jim</name> </person> <person id="2"> <name>Joe</name> </person&g

假设我有以下临时文件:

<xsl:variable name="emc">
    <people>
        <person id="1">
            <name>Jim</name>
        </person>
        <person id="2">
            <name>Joe</name>
        </person>
    </people>
</xsl:variable>

<xsl:variable name="ibm">
    <people>
        <person id="1">
            <name>Joan</name>
        </person>
        <person id="2">
            <name>Allison</name>
        </person>
    </people>
</xsl:variable>
<xsl:variable name="store">
    <store>
        <doc>{$emc goes here}</doc>
        <doc>{$ibm does here}</doc>
    </store>
</xsl:variable>

吉姆
乔
琼
艾利森
我想要另一个文档来存储以前文档的根节点:

<xsl:variable name="emc">
    <people>
        <person id="1">
            <name>Jim</name>
        </person>
        <person id="2">
            <name>Joe</name>
        </person>
    </people>
</xsl:variable>

<xsl:variable name="ibm">
    <people>
        <person id="1">
            <name>Joan</name>
        </person>
        <person id="2">
            <name>Allison</name>
        </person>
    </people>
</xsl:variable>
<xsl:variable name="store">
    <store>
        <doc>{$emc goes here}</doc>
        <doc>{$ibm does here}</doc>
    </store>
</xsl:variable>

{$emc在这里运行}
{$ibm在这里做什么}
我可以这样做,但我不能再像使用$emc或$ibm的值那样使用doc元素的内容

就是

<xsl:variable name="doc1" select="$store/store/doc[1]">

并使$doc1/people/person[1]与$ibm/people/person[1]处于同一节点

这在某些版本的XSLT中可能吗


提前感谢。

请查看特定于XSLT引擎的
节点集
函数。例如,MSXML具有将树转换为节点集的
node-set()
函数

这里发生的事情是,在XSLT1.0中,变量指令中的文本XML内容的值是“”(RTF),不幸的是,它不能直接作为节点集处理(除非将其视为具有字符串值的单个节点)。因此,使用
/
[]
的XPath表达式对其不起作用

解决方案是要么像@polishchuk所说的那样使用like
node-set()
(但使其可移植变得更加棘手);或者使用XSLT2.0

在XSLT2.0中,最重要的是(人们非常高兴!)。变量的值是一个临时树,XPath操作符可以像源树一样对其进行操作

更新:保留节点标识

当您说“在存储文档中”(下面的注释)时,您是指在临时树中,
$store
变量的值?由于问题中的内容是结构化的,所以这是不可能的,因为某些XML节点必须有两个父节点。但是您可以使
$store
树成为数据的实际位置,并从中选择
$emc
$ibm

<xsl:variable name="store">
    <store>
        <doc id="emc">
            <people>
                <person id="1">
                    <name>Jim</name>
                </person>...
            </people>
        </doc>
        <doc id="ibm">
            <people>
                <person id="1">
                    <name>Joan</name>
                </person>...
            </people>
        </doc>
    </store>
</xsl:variable>

<xsl:variable name="emc" select="$store/store/doc[@id='emc']" />
<xsl:variable name="ibm" select="$store/store/doc[@id='ibm']" />

吉姆
...
琼
...
然后,
$doc1/people/person[1]
确实是与
$ibm/people/person[1]
相同的节点


可以想象使用
doc()
和外部文件会有一些变化,但在花时间之前,我想了解更多关于您的需求的信息,特别是上面的场景如何无法满足这些需求。

存储一组文档节点所需的数据结构不是文档,而是节点集。因此,与此相反:

<xsl:variable name="store">
    <store>
        <doc>{$emc goes here}</doc>
        <doc>{$ibm does here}</doc>
    </store>
</xsl:variable>

{$emc在这里运行}
{$ibm在这里做什么}
只要这样做:

<xsl:variable name="store" select="$emc | $ibm"/>


在XSLT1.0中,这严格来说是一个节点集,因此您无法控制排序。在XSLT2.0中,您可以通过使用“,”操作符代替“|”,来定义节点序列,然后节点将按照所需的顺序排列。

我想您错过了一条评论,即$doc1/people/person[1]和$ibm/people/person[1]必须是同一个节点(我认为这是xpath中的is关系)。我希望能够“存储”存储文档中的文档节点,并将它们完全按照放入文档之前的方式提取出来。
希望这能有所帮助。@Fred:你说得对,我错过了那条评论,或者误解了它。我不知道你所说的“完全按照放入之前的方式提取它们”是什么意思,这需要节点标识,而不是副本。谢谢你的帮助,但这并不是我真正想要的。实际上,最接近的是将generate id的值映射到node()的函数。也许在xpath 4.0中:)@Fred,很抱歉它不能满足需要。我想知道这些要求是什么。关于您描述的函数,带有
的键是否可以使用=“generate-id()”
工作?我不确定是否要为它获取正确的文档…我使用了一个带有generate id的键,但我还必须传递一系列文档节点。我存储感兴趣的元素及其文档节点的generate id。我使用序列来解析id。有点混乱,但它可以工作。再次感谢。所以,我只是想确保我不能以某种方式将其存储在文档中?这就是我最终想要做的。我需要文件提供的结构。如果我通过模板参数传递“存储”,我有很多管理工作要做,很难绕过模板调用的堆栈性质。谢谢。@Fred,文档节点不能有父节点。()“文档节点永远不能显示为子节点”,因此不能在文档中存储文档。如果我正确理解了你的问题,我希望有一种方法可以有效地“包装”(或原子化)节点以允许这种情况发生,但我想不会。谢谢