如何使用DTD为xml中的属性设置默认值



如何设置xml中属性的默认值。请考虑下面的test.xml。已为元素"to"定义了默认值为"male"的属性"gender"。但是,我无法使用xmlstarlet检索它。我做错什么了吗?请帮忙。

<?xml version="1.0"?>
<!DOCTYPE message [
  <!ELEMENT message (to,from,subject,text)>
  <!ELEMENT to       (#PCDATA)>
  <!ELEMENT from     (#PCDATA)>
  <!ELEMENT subject  (#PCDATA)>
  <!ELEMENT text     (#PCDATA)>
  <!ATTLIST to gender CDATA "male">
]>
<message>
  <to>Dave</to>
  <from>Susan</from>
  <subject>Reminder</subject>
  <text>Dont forget to buy milk on the way home.</text>
</message>

xmlstarlet cmd:(不将任何内容打印到stdout(

xmlstarlet sel -T -t -m "//message/to" -v "@gender" -n test.xml

使用默认值声明gender属性是可以的。它一定是xmlstartlet的sel命令。要么是这样,要么是如何使用它。不过我对xmlstarlet了解不多。您可以使用XSLT验证默认值:

XML输入(test.XML(

<!DOCTYPE message [
<!ELEMENT message (to,from,subject,text)>
<!ELEMENT to       (#PCDATA)>
<!ELEMENT from     (#PCDATA)>
<!ELEMENT subject  (#PCDATA)>
<!ELEMENT text     (#PCDATA)>
<!ATTLIST to gender CDATA "male">
]>
<message>
  <to>Dave</to>
  <from>Susan</from>
  <subject>Reminder</subject>
  <text>Dont forget to buy milk on the way home.</text>
</message>

XSLT 1.0(test.xsl(

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/*">
        <xsl:value-of select="to/@gender"/>
    </xsl:template>
</xsl:stylesheet>

命令行和输出(Windows上的xmlstarlet(

C:appsxmlstarlet-1.4.2>xml tr test.xsl test.xml
male

不幸的是,XMLStarlet对默认名称空间非常挑剔。如果文档已经声明了它(xmlns=(,那么您也必须为XMLStarlet声明它,并在元素前面加上您选择的名称。查看此

请参阅用户指南。试试这个:

xml sel -T -t -m "/message/to" -v "@gender" -n test.xml

请参阅此

xmlstarlet的sel命令没有任何方法来获取默认属性(至少是一个bug或缺少的特性(。你可以像@DanielHaley的解决方案一样使用tr来解决这个问题:

# bash allows a more concise solution than cmd.exe
xmlstarlet tr <(xmlstarlet sel -C -T -t -v /message/to/@gender) test.xml

或者通过c14n运行它,首先获得默认属性值:

xmlstarlet c14n test.xml | xmlstarlet sel -T -t -v /message/to/@gender

c14n从1.0.3版本开始扩展属性。xmllint --dtdattr可以代替。

最新更新