微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

捕获的累加器上的id

如何解决捕获的累加器上的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)}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。