Gelöst:
Intern war der Baum bereits richtig konfiguriert. Das Problem entsteht bei der Ausgabe der Knoten über die Funktionen HTML::Element::starttag bzw. ..::endtag.
Darin wird per Bool Variable $html_uc entweder in Kleinschreibung oder Grosschreibung konvertiert. Die einzigen beiden Lösungen sind:
a) Man benutzt HTML::Element:starttag_XML und HTML::Element:endtag_XML
b) Man überschreibt die Methoden in einer eigenen Klasse.
Ich habe mich für Variante b) entschieden, weil bei der Variante mit XML vielleicht anders escaped wird als bei html. Daher hier nun die geänderte Datei:
Datei MyElement.pm:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/usr/bin/perl
package MyElement;
use HTML::Element;
#inherit from Element
@ISA = qw(HTML::Element);
sub dummy{
#HTML::Element::_fold_case_NOT;
@a = HTML::Element::_fold_case_NOT(@_);
return @a;
}
*HTML::Element::_fold_case = \&HTML::Element::_fold_case_NOT;
#*_fold_case = \&dummy;
#constructor
sub new {
my $class = shift;
$class = ref($class) || $class;
#invoke base constructor
my $self = $class->SUPER::new(@_);
bless($self, $class);
return $self;
}
sub starttag {
my ( $self, $entities ) = @_;
my $name = $self->{'_tag'};
return $self->{'text'} if $name eq '~literal';
return "<!" . $self->{'text'} . ">" if $name eq '~declaration';
return "<?" . $self->{'text'} . ">" if $name eq '~pi';
if ( $name eq '~comment' ) {
if ( ref( $self->{'text'} || '' ) eq 'ARRAY' ) {
# Does this ever get used? And is this right?
return
"<!"
. join( ' ', map( "--$_--", @{ $self->{'text'} } ) ) . ">";
}
else {
return "<!--" . $self->{'text'} . "-->";
}
}
my $tag = "<$name";
my $val;
for ( sort keys %$self ) { # predictable ordering
next if !length $_ or m/^_/s or $_ eq '/';
$val = $self->{$_};
next if !defined $val; # or ref $val;
if ($_ eq $val && # if attribute is boolean, for this element
exists( $HTML::Element::boolean_attr{$name} )
&& (ref( $HTML::Element::boolean_attr{$name} )
? $HTML::Element::boolean_attr{$name}{$_}
: $HTML::Element::boolean_attr{$name} eq $_
)
)
{
$tag .= " $_";
}
else { # non-boolean attribute
if ( ref $val eq 'HTML::Element'
and $val->{_tag} eq '~literal' )
{
$val = $val->{text};
}
else {
HTML::Entities::encode_entities( $val, $entities )
unless (
defined($entities) && !length($entities)
|| $encoded_content
);
}
$val = qq{"$val"};
$tag .= qq{ $_\E=$val};
}
} # for keys
if ( scalar $self->content_list == 0
&& $self->_empty_element_map->{ $self->tag } )
{
return $tag . " />";
}
else {
return $tag . ">";
}
}
sub endtag {
"</$_[0]->{'_tag'}>";
}
return 1;
Gruß
mcfaq.
Last edited: 2011-05-10 13:21:34 +0200 (CEST)