2

如何在 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:(不向标准输出打印任何内容)

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

3 回答 3

1

gender使用默认值声明属性很好。一定是selxmlstartlet命令的东西。无论是那个还是你如何尝试使用它。不过,我对 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:\apps\xmlstarlet-1.4.2>xml tr test.xsl test.xml
male
于 2013-05-08T16:25:03.440 回答
0

xmlstarlet 的sel命令无法获取默认属性(至少是一个错误或缺少的功能)。tr您可以通过在@DanielHaley 的解决方案中使用 as 来解决它:

# 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可以代替工作。

于 2013-05-08T17:36:42.267 回答
0

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

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

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

参考这个

于 2013-05-08T08:40:15.083 回答