Java 如何使用idref获取xml元素的内容
我有一个XML模式:-Java 如何使用idref获取xml元素的内容,java,xml,xml-parsing,Java,Xml,Xml Parsing,我有一个XML模式:- <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified"> <xsd:element name="Person"> <xsd:complexType> <xsd:sequence&g
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="unqualified">
<xsd:element name="Person">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:ID" use="required"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="Book">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Title" type="xsd:string"/>
<xsd:element name="Author">
<xsd:complexType>
<xsd:attribute name="idref" type="xsd:IDREF"
use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Person" />
<xsd:element ref="Book" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
与上述XML模式对应,我有以下传入的XML:-
<?xml version="1.0" encoding="utf-8" ?>
<root>
<Person id="P234">
<Name>0002</Name>
</Person>
<Book>
<Title>0001</Title>
<Author idref="P234"/>
</Book>
</root>
0002
0001
我知道使用XML解析器验证,我可以验证上面的XML是否符合我的XML模式。例如,id和idref应该存在。现在我想知道的是哪个解析器(SAX/DOM/STAX)可以基于idref获取完整的XML元素。所以基本上在上面的例子中,
一旦解析器到达idref=“P234”,它应该会返回complete…
。另一个查询是,是否有任何解析器支持id和idref合并,这可以用实际元素替换idref的内容,并返回合并后的XML。正如我所知,解析器不支持id和idref合并。使用XSLT实现这一神奇的功能。此外,IDREF可以是自引用的,具有循环依赖性,因此不可能“用实际元素替换内容”
例如,假设您拥有xml:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<Person id="P234">
<Name>0002</Name>
<WroteBook idref="B442"/>
</Person>
<Book id="B442">
<Title>0001</Title>
<Author idref="P234"/>
</Book>
</root>
0002
0001
您希望从解析器中得到什么
XSLT(但不是我自己测试的):
如果解析器周围没有任何功能,id和idref的实际用法是什么。在不使用XSLT的情况下,指定id和idref的实际需要是什么。您还可以详细说明如何使用XSLT实现魔术。谢谢。这是一种表示元素之间引用的方法,解析器只检查有效性,这样验证文档的XML使用者将确保所有引用都已解析。没有任何其他方法可以在XSD中表达它。另外,其他一些xml技术也有ID的概念,例如DOM有getElementById方法。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@idref">
<xsl:apply-templates select="id(.)"/>
</xsl:template>
</xsl:stylesheet>