dbertoni 01/02/08 13:46:45
Modified: c/src/XSLT ElemAttribute.cpp
Log:
Fixed problem with allowing attribute with unknown prefix. Use provided
prefix whenever possible.
Revision Changes Path
1.16 +50 -17 xml-xalan/c/src/XSLT/ElemAttribute.cpp
Index: ElemAttribute.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemAttribute.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- ElemAttribute.cpp 2001/01/30 21:59:56 1.15
+++ ElemAttribute.cpp 2001/02/08 21:46:44 1.16
@@ -193,18 +193,26 @@
{
indexOfNSSep = indexOf(origAttrName,
XalanUnicode::charColon);
- if(indexOfNSSep < origAttrNameLength)
- {
- assign(attrName, substring(attrName,
indexOfNSSep + 1));
- }
-
+ // See if the namespace already exists. If it
does, we'll get the
+ // prefix that was used when it was declared.
const XalanDOMString& prefix =
executionContext.getResultPrefixForNamespace(attrNameSpace);
if(isEmpty(prefix) == false)
{
- reserve(
- attrName,
- length(attrName) +
DOMServices::s_XMLNamespaceSeparatorStringLength + length(prefix) + 1);
+ if(indexOfNSSep < origAttrNameLength)
+ {
+ reserve(
+ attrName,
+ length(attrName) -
(indexOfNSSep + 1) + DOMServices::s_XMLNamespaceSeparatorStringLength +
length(prefix) + 1);
+
+ assign(attrName,
substring(attrName, indexOfNSSep + 1));
+ }
+ else
+ {
+ reserve(
+ attrName,
+ length(attrName) +
DOMServices::s_XMLNamespaceSeparatorStringLength + length(prefix) + 1);
+ }
insert(attrName, 0,
DOMServices::s_XMLNamespaceSeparatorString);
insert(attrName, 0, prefix);
@@ -215,8 +223,39 @@
XalanDOMString& newPrefix =
newPrefixGuard.get();
-
executionContext.getUniqueNamespaceValue(newPrefix);
+ // If the prefix on the QName is xmlns,
we cannot use it.
+ const bool
fPrefixIsXMLNS =
+ startsWith(origAttrName,
DOMServices::s_XMLNamespaceWithSeparator);
+
+ // If there's a prefix, and it's not
xmlns, then use
+ // the prefix that's provided.
+ if(indexOfNSSep < origAttrNameLength &&
+ fPrefixIsXMLNS == false)
+ {
+ newPrefix =
substring(origAttrName, 0, indexOfNSSep);
+ }
+ else
+ {
+ // If there's a prefix, and
it's xmlns, then strip it
+ // off...
+ if (fPrefixIsXMLNS == true)
+ {
+ assign(attrName,
substring(attrName, indexOfNSSep + 1));
+ }
+
+ // Get a new, unique namespace
prefix...
+
executionContext.getUniqueNamespaceValue(newPrefix);
+
+ // Reserve some space in the
string.
+ reserve(
+ attrName,
+ length(attrName) +
DOMServices::s_XMLNamespaceSeparatorStringLength + length(newPrefix) + 1);
+
+ insert(attrName, 0,
DOMServices::s_XMLNamespaceSeparatorString);
+ insert(attrName, 0, newPrefix);
+ }
+ // OK, now we have to generate a
namespace declaration...
StylesheetExecutionContext::GetAndReleaseCachedString
nsDeclGuard(executionContext);
XalanDOMString& nsDecl =
nsDeclGuard.get();
@@ -224,17 +263,11 @@
reserve(nsDecl,
DOMServices::s_XMLNamespaceWithSeparatorLength + length(newPrefix) + 1);
assign(nsDecl,
DOMServices::s_XMLNamespaceWithSeparator);
-
+
append(nsDecl, newPrefix);
+ // Add the namespace declaration...
executionContext.addResultAttribute(nsDecl, attrNameSpace);
-
- reserve(
- attrName,
- length(attrName) +
DOMServices::s_XMLNamespaceSeparatorStringLength + length(newPrefix) + 1);
-
- insert(attrName, 0,
DOMServices::s_XMLNamespaceSeparatorString);
- insert(attrName, 0, newPrefix);
}
}
}