【问题标题】:Adding Doctype instruction to a XML node in XQuery向 XQuery 中的 XML 节点添加 Doctype 指令
【发布时间】:2011-04-21 19:59:49
【问题描述】:

在我的 XQuery 中,我有一个 xml 节点存储在变量 $d 中,例如:

<topic id="IL27TRM409WedNov1919274820081">
<title>Access Switch Failure</title>
<body>
    and Reacting</i> feature of the <i>SMSC User Guide</i>.</p>
</body>
</topic>

我现在的问题是,由于我需要在上面的文档顶部添加三个处理指令,包括DocType声明,目前结果文档只是一个纯XML节点。所以基本上我想添加以下三行:

<?xml version="1.0" encoding="UTF-8"?>
<?exist-serialize indent="no" output-doctype="yes"?>
<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN" "task.dtd">

在顶部。我尝试将concat() 用于$d,但失败了。我想知道这种显式的 XML 内容操作在 XQuery 中是否可行,否则我认为我必须对我的 XSLT 进行更改以拥有 $d Borned-with processing-instructions。

【问题讨论】:

  • 您的第一行是 XML 声明,第二行是处理指令,第三行是 DOCTYPE 声明。三者中只有一个是处理指令。
  • @Michael:那是不是说第一行和第三行可以更直接地放?
  • 不,相反。 XQuery 1.0 具有用于生成处理指令的语法。它没有生成 XML 声明或 DOCTYPE 声明的语法。

标签: xml xslt xpath xquery


【解决方案1】:

要输出 XML 声明和 DOCTYPE 声明,您需要设置影响查询结果序列化方式的参数。执行此操作的方式取决于您使用的 XQuery 处理器。

要输出处理指令,请在查询正文中使用文字处理指令。

【讨论】:

    【解决方案2】:

    您应该将处理指令与 xsl 输出一起使用,例如:

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" 
        doctype-public="-//OASIS//DTD DITA Task//EN" 
        doctype-system="task.dtd"/>
    
        <xsl:template match="/">
            <xsl:processing-instruction name="exist-serialize">indent="no" output-doctype="yes"
            </xsl:processing-instruction>
    
            <xsl:apply-templates />
        </xsl:template>
        [...]
    </xsl:stylesheet>
    

    【讨论】:

    • 这有点帮助。但是由于我有两种模板匹配,另一种是与Topic匹配,那么doctype-system应该是“topic.dtd”,所以我不能让它成为一个全局的“task.dtd”,你有什么建议?
    • 我不太明白...您是否希望此 xslt 能够处理具有不同根标签的 xml,并根据这些标签表现出不同的行为?
    • 你可能想看看this post关于添加不同的DTD到基于根节点的输出xmls。
    • 如果问题是关于动态 DOCTYPE 生成的,这是一个正确的链接stackoverflow.com/questions/4275304/…
    • 不幸的是,我无法在 xsl2 中完成这项工作,但我仍在继续寻找我可能做错的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多