0

How do i set default values for attributes in xml. Consider below test.xml. An attribute 'gender' with default value 'male' has been defined for element 'to'. I am however unable to retrieve it using xmlstarlet. Am i doing something wrong? Please help.

<?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: (doesnt print anything to stdout)

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

1 Answer 1

0

Your declaration of the gender attribute with the default value is fine. It must be something with the sel command of xmlstartlet. Either that or how you're trying to use it. I don't know much about xmlstarlet though. You can use XSLT to verify the default value:

XML Input (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>

Command Line and Output (xmlstarlet on Windows)

C:\apps\xmlstarlet-1.4.2>xml tr test.xsl test.xml
male

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .