捕获的累加器上的id

问题描述

我有一个可存储某些xs:ID类型数据的累加器。我想使用id()函数引用它,起初我认为这可行。可以,但是只有在向`accumulator-after('acc')/ id函数提供一个字符串文字时才可以。如果传递表达式(例如节点),则该函数将不返回任何内容。我测试了全局id()函数关闭了流传输),它按预期工作。这是我的测试用例

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    targetNamespace="urn:test" xmlns:ns1="urn:test">
    <xsd:complexType name="IDHolder" abstract="false" mixed="true">
        <xsd:attribute name="ObjectId" type="xsd:ID" use="required"/>
    </xsd:complexType>
    <xsd:element name="RootElement">
        <xsd:complexType>
            <xsd:sequence maxOccurs="1">
                <xsd:element name="MiddleElement">
                    <xsd:complexType>
                        <xsd:sequence maxOccurs="unbounded">
                            <xsd:element name="ChildElement" type="ns1:IDHolder"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="ObjectId" type="xsd:IDREF" use="required"/>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

XSL

<?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"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:t="urn:test"
    exclude-result-prefixes="xs math" version="3.0" expand-text="yes">
    <xsl:mode streamable="yes" use-accumulators="#all"/>
    <xsl:import-schema schema-location="issuereporo.xsd" namespace="urn:test"/>
    <xsl:accumulator name="acc" as="node()?" initial-value="()" streamable="yes">
        <xsl:accumulator-rule xmlns:saxon="http://saxon.sf.net/" match="t:MiddleElement" select="."
            phase="end" saxon:capture="yes"/>
    </xsl:accumulator>
    <xsl:template match="t:RootElement">
        <xsl:apply-templates />        
        <xsl:variable name="vAcc" select="accumulator-after('acc')"/> 
        Direct Access 
        {$vAcc/id('_1')}
        Access via context node
<!--THIS IS WHAT DOESN'T WORK-->
        {$vAcc/id(@ObjectId)} 
        Access via global
        <!-- will only work when streaming is off --> 
        {id(@ObjectId)} 
    </xsl:template>
</xsl:stylesheet>

XML

<?xml version="1.0" encoding="UTF-8"?>
<RootElement xmlns="urn:test" ObjectId="_2"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="urn:test file:/C:/Users/john/Documents/GitHub/streamatron-test/issuereporo.xsd">
    <MiddleElement>
        <ChildElement ObjectId="_1">C
        </ChildElement>
        <ChildElement ObjectId="_2">D
        </ChildElement>        
    </MiddleElement>
</RootElement>

解决方法

我认为您想要{$vAcc/id(current()/@ObjectId)}而不是{$vAcc/id(@ObjectId)}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...