如何解决捕获的累加器上的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 举报,一经查实,本站将立刻删除。