Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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
Java 如何使用idref获取xml元素的内容_Java_Xml_Xml Parsing - Fatal编程技术网

Java 如何使用idref获取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模式:-

<?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>