include/oox/export/vmlexport.hxx             |    2 
 include/sax/fastattribs.hxx                  |   21 -
 include/sax/fshelper.hxx                     |    4 
 oox/source/export/vmlexport.cxx              |    6 
 sax/qa/cppunit/attributes.cxx                |   14 
 sax/source/fastparser/fastparser.cxx         |   57 +--
 sax/source/tools/fastattribs.cxx             |   41 --
 sax/source/tools/fastserializer.cxx          |    4 
 sax/source/tools/fastserializer.hxx          |    2 
 sw/source/filter/ww8/docxattributeoutput.cxx |  505 ++++++++++-----------------
 sw/source/filter/ww8/docxattributeoutput.hxx |   27 -
 sw/source/filter/ww8/docxsdrexport.cxx       |   45 +-
 sw/source/filter/ww8/docxtableexport.cxx     |   45 +-
 13 files changed, 319 insertions(+), 454 deletions(-)

New commits:
commit d856be879e0b94b36c8f87817de74189a8a04121
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Thu Apr 6 07:29:56 2023 +0300
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Thu Apr 6 23:02:16 2023 +0200

    Use more *string_view
    
    Change-Id: Ic82bbb1b8d6b03066e66f5eb93e9a94b16b1a9f2
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150072
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/include/oox/export/vmlexport.hxx b/include/oox/export/vmlexport.hxx
index fb53ec099f7a..f6b9869dae7a 100644
--- a/include/oox/export/vmlexport.hxx
+++ b/include/oox/export/vmlexport.hxx
@@ -158,7 +158,7 @@ protected:
     ///
     /// This should be called from within StartShape() to ensure that the
     /// added attribute is preserved.
-    void                AddShapeAttribute( sal_Int32 nAttribute, const 
OString& sValue );
+    void AddShapeAttribute(sal_Int32 nAttribute, std::string_view sValue);
 
     using EscherEx::StartShape;
     using EscherEx::EndShape;
diff --git a/include/sax/fastattribs.hxx b/include/sax/fastattribs.hxx
index 2dc7c3d72420..61eb048e881a 100644
--- a/include/sax/fastattribs.hxx
+++ b/include/sax/fastattribs.hxx
@@ -62,14 +62,13 @@ class SAX_DLLPUBLIC FastTokenHandlerBase :
     /**
      * Client method to attempt the use of this interface if possible.
      * @xTokenHandler - the token lookup interface
-     * @pStr - string buffer to lookup
-     * @nLength - optional length of chars in that buffer
+     * @str - string buffer to lookup
      *
-     * @return Tokenized form of pStr
+     * @return Tokenized form of str
      */
     static sal_Int32 getTokenFromChars(
                          const FastTokenHandlerBase *pTokenHandler,
-                         const char *pStr, size_t nLength );
+                         std::string_view str );
 };
 
 
@@ -88,11 +87,17 @@ public:
     }
     void add( const FastAttributeList& );
     void add( const css::uno::Reference<css::xml::sax::XFastAttributeList>& );
-    void add( sal_Int32 nToken, const char* pValue );
-    void add( sal_Int32 nToken, const char* pValue, size_t nValueLength );
-    void add( sal_Int32 nToken, const OString& rValue );
+    void add( sal_Int32 nToken, std::string_view value );
     void add( sal_Int32 nToken, std::u16string_view sValue ); // Converts to 
UTF-8
-    void addNS( sal_Int32 nNamespaceToken, sal_Int32 nToken, const OString& 
rValue );
+    template <typename C, typename T1, typename T2>
+    void add( sal_Int32 nToken, rtl::StringConcat<C, T1, T2>&& value) { 
add(nToken, Concat2View(value)); }
+    template <typename Val, typename... Rest, 
std::enable_if_t<(sizeof...(Rest) > 0), int> = 0>
+    void add( sal_Int32 nToken, Val&& val, Rest&&... rest )
+    {
+        add(nToken, std::forward<Val>(val));
+        add(std::forward<Rest>(rest)...);
+    }
+    void addNS( sal_Int32 nNamespaceToken, sal_Int32 nToken, std::string_view 
sValue );
     void addNS( sal_Int32 nNamespaceToken, sal_Int32 nToken, 
std::u16string_view sValue );
     // note: rQName is *namespace-prefixed*
     void addUnknown( const OUString& rNamespaceURL, const OString& rQName, 
const OString& value );
diff --git a/include/sax/fshelper.hxx b/include/sax/fshelper.hxx
index 338260861132..74e2ed4e3254 100644
--- a/include/sax/fshelper.hxx
+++ b/include/sax/fshelper.hxx
@@ -126,12 +126,8 @@ public:
         { endElement( FSNS( namespaceTokenId, elementTokenId ) ); }
 
     void singleElement(sal_Int32 elementTokenId, const 
rtl::Reference<FastAttributeList>& xAttrList);
-    void singleElementNS(sal_Int32 namespaceTokenId, sal_Int32 elementTokenId, 
rtl::Reference<FastAttributeList> const & xAttrList)
-        { singleElement(FSNS( namespaceTokenId, elementTokenId), xAttrList); }
 
     void startElement(sal_Int32 elementTokenId, const 
rtl::Reference<FastAttributeList>& xAttrList);
-    void startElementNS(sal_Int32 namespaceTokenId, sal_Int32 elementTokenId, 
rtl::Reference<FastAttributeList> const & xAttrList)
-        { startElement( FSNS( namespaceTokenId, elementTokenId ), xAttrList ); 
}
 
     FastSerializerHelper* write(const char* value);
     FastSerializerHelper* write(const OString& value);
diff --git a/oox/source/export/vmlexport.cxx b/oox/source/export/vmlexport.cxx
index 7cbfe1f14bfa..38d3b9feacd1 100644
--- a/oox/source/export/vmlexport.cxx
+++ b/oox/source/export/vmlexport.cxx
@@ -158,7 +158,7 @@ sal_uInt32 VMLExport::EnterGroup( const OUString& 
rShapeName, const tools::Recta
         AddRectangleDimensions( aStyle, *pRect, rbAbsolutePos );
 
     if ( !aStyle.isEmpty() )
-        pAttrList->add( XML_style, aStyle.makeStringAndClear() );
+        pAttrList->add( XML_style, aStyle );
 
     // coordorigin/coordsize
     if ( pRect && ( mnGroupLevel == 1 ) )
@@ -335,7 +335,7 @@ static void impl_AddInt( sax_fastparser::FastAttributeList 
*pAttrList, sal_Int32
     if ( !pAttrList )
         return;
 
-    pAttrList->add( nElement, OString::number( nValue ).getStr() );
+    pAttrList->add( nElement, OString::number( nValue ) );
 }
 
 static sal_uInt16 impl_GetUInt16( const sal_uInt8* &pVal )
@@ -1188,7 +1188,7 @@ void VMLExport::AddRectangleDimensions( OStringBuffer& 
rBuffer, const tools::Rec
     AddFlipXY();
 }
 
-void VMLExport::AddShapeAttribute( sal_Int32 nAttribute, const OString& rValue 
)
+void VMLExport::AddShapeAttribute( sal_Int32 nAttribute, std::string_view 
rValue )
 {
     m_pShapeAttrList->add( nAttribute, rValue );
 }
diff --git a/sax/qa/cppunit/attributes.cxx b/sax/qa/cppunit/attributes.cxx
index 6c71e9aa182a..5b45876e3e96 100644
--- a/sax/qa/cppunit/attributes.cxx
+++ b/sax/qa/cppunit/attributes.cxx
@@ -35,7 +35,9 @@ void AttributesTest::test()
 {
     rtl::Reference<sax_fastparser::FastAttributeList> xAttributeList( new 
sax_fastparser::FastAttributeList(nullptr) );
     xAttributeList->add(1, "1");
-    xAttributeList->add(2, OString("2"));
+    xAttributeList->add(2, OString::Concat("2"));
+    xAttributeList->add(3, u"3");
+    xAttributeList->add(4, OUString::Concat("4"));
 
     // We can't test getValueToken() and getOptionalValueToken()
     // without XFastTokenHandler :-(
@@ -44,20 +46,22 @@ void AttributesTest::test()
     // xAttributeList->getValueToken(2);
 
     CPPUNIT_ASSERT( xAttributeList->hasAttribute(1) );
-    CPPUNIT_ASSERT( !xAttributeList->hasAttribute(3) );
+    CPPUNIT_ASSERT( !xAttributeList->hasAttribute(5) );
 
     CPPUNIT_ASSERT_EQUAL( OUString("2"), xAttributeList->getOptionalValue(2)  
);
-    CPPUNIT_ASSERT_EQUAL( OUString(), xAttributeList->getOptionalValue(3) );
+    CPPUNIT_ASSERT_EQUAL( OUString("3"), xAttributeList->getOptionalValue(3) );
+    CPPUNIT_ASSERT_EQUAL( OUString("4"), xAttributeList->getOptionalValue(4) );
+    CPPUNIT_ASSERT_EQUAL( OUString(), xAttributeList->getOptionalValue(5) );
 
     CPPUNIT_ASSERT_EQUAL( OUString("1"), xAttributeList->getValue(1) );
-    CPPUNIT_ASSERT_THROW( xAttributeList->getValue(3), xml::sax::SAXException 
);
+    CPPUNIT_ASSERT_THROW( xAttributeList->getValue(5), xml::sax::SAXException 
);
 
     xAttributeList->addUnknown("a", "a");
     xAttributeList->addUnknown("b", "b", "b");
     xAttributeList->addUnknown("c", "c");
     CPPUNIT_ASSERT_EQUAL( sal_Int32(3), 
xAttributeList->getUnknownAttributes().getLength() );
 
-    CPPUNIT_ASSERT_EQUAL( sal_Int32(2), 
xAttributeList->getFastAttributes().getLength() );
+    CPPUNIT_ASSERT_EQUAL( sal_Int32(4), 
xAttributeList->getFastAttributes().getLength() );
 
     xAttributeList->clear();
     CPPUNIT_ASSERT( !xAttributeList->hasAttribute(1) );
diff --git a/sax/source/fastparser/fastparser.cxx 
b/sax/source/fastparser/fastparser.cxx
index 06e2fb1e3e92..344dda9cd63e 100644
--- a/sax/source/fastparser/fastparser.cxx
+++ b/sax/source/fastparser/fastparser.cxx
@@ -278,13 +278,13 @@ private:
     void sendPendingCharacters();
     void addUnknownElementWithPrefix(const xmlChar **attributes, int i, 
rtl::Reference< FastAttributeList > const & xAttributes);
 
-    sal_Int32 GetToken( const xmlChar* pName, sal_Int32 nameLen );
+    sal_Int32 GetToken( const xmlChar* pName );
     /// @throws css::xml::sax::SAXException
-    sal_Int32 GetTokenWithPrefix( const xmlChar* pPrefix, int prefixLen, const 
xmlChar* pName, int nameLen );
+    sal_Int32 GetTokenWithPrefix( const xmlChar* pPrefix, const xmlChar* pName 
);
     /// @throws css::xml::sax::SAXException
     OUString const & GetNamespaceURL( std::string_view rPrefix );
     sal_Int32 GetNamespaceToken( const OUString& rNamespaceURL );
-    sal_Int32 GetTokenWithContextNamespace( sal_Int32 nNamespaceToken, const 
xmlChar* pName, int nNameLen );
+    sal_Int32 GetTokenWithContextNamespace( sal_Int32 nNamespaceToken, const 
xmlChar* pName );
     void DefineNamespace( const OString& rPrefix, const OUString& namespaceURL 
);
 
 private:
@@ -693,43 +693,30 @@ void FastSaxParserImpl::DefineNamespace( const OString& 
rPrefix, const OUString&
     rEntity.maNamespaceDefines[nOffset] = NamespaceDefine( rPrefix, 
GetNamespaceToken( namespaceURL ), namespaceURL );
 }
 
-sal_Int32 FastSaxParserImpl::GetToken( const xmlChar* pName, sal_Int32 nameLen 
/* = 0 */ )
+sal_Int32 FastSaxParserImpl::GetToken(const xmlChar* pName)
 {
     return FastTokenHandlerBase::getTokenFromChars( getEntity(). 
mxTokenHandler.get(),
-                                                    XML_CAST( pName ), nameLen 
); // uses utf-8
+                                                    XML_CAST( pName ) ); // 
uses utf-8
 }
 
-sal_Int32 FastSaxParserImpl::GetTokenWithPrefix( const xmlChar* pPrefix, int 
nPrefixLen, const xmlChar* pName, int nNameLen )
+sal_Int32 FastSaxParserImpl::GetTokenWithPrefix( const xmlChar* pPrefix, const 
xmlChar* pName )
 {
-    sal_Int32 nNamespaceToken = FastToken::DONTKNOW;
-
     Entity& rEntity = getEntity();
     if (rEntity.maNamespaceCount.empty())
-        return nNamespaceToken;
+        return FastToken::DONTKNOW;
 
+    std::string_view sPrefix(XML_CAST(pPrefix));
     sal_uInt32 nNamespace = rEntity.maNamespaceCount.top();
     while( nNamespace-- )
     {
         const auto & rNamespaceDefine = rEntity.maNamespaceDefines[nNamespace];
-        const OString& rPrefix( rNamespaceDefine.maPrefix );
-        if( (rPrefix.getLength() == nPrefixLen) &&
-            rtl_str_reverseCompare_WithLength(rPrefix.pData->buffer, 
rPrefix.pData->length, XML_CAST( pPrefix ), nPrefixLen ) == 0 )
-        {
-            nNamespaceToken = rNamespaceDefine.mnToken;
-            break;
-        }
-
-        if( !nNamespace && !m_bIgnoreMissingNSDecl )
-            throw SAXException("No namespace defined for " + 
OUString(XML_CAST(pPrefix),
-                    nPrefixLen, RTL_TEXTENCODING_UTF8), Reference< XInterface 
>(), Any());
+        if( rNamespaceDefine.maPrefix == sPrefix )
+            return GetTokenWithContextNamespace(rNamespaceDefine.mnToken, 
pName);
     }
 
-    if( nNamespaceToken != FastToken::DONTKNOW )
-    {
-        sal_Int32 nNameToken = GetToken( pName, nNameLen );
-        if( nNameToken != FastToken::DONTKNOW )
-            return nNamespaceToken | nNameToken;
-    }
+    if (!m_bIgnoreMissingNSDecl)
+        throw SAXException("No namespace defined for " + 
OStringToOUString(sPrefix,
+            RTL_TEXTENCODING_UTF8), {}, {});
 
     return FastToken::DONTKNOW;
 }
@@ -758,11 +745,11 @@ OUString const & FastSaxParserImpl::GetNamespaceURL( 
std::string_view rPrefix )
             Reference< XInterface >(), Any());
 }
 
-sal_Int32 FastSaxParserImpl::GetTokenWithContextNamespace( sal_Int32 
nNamespaceToken, const xmlChar* pName, int nNameLen )
+sal_Int32 FastSaxParserImpl::GetTokenWithContextNamespace( sal_Int32 
nNamespaceToken, const xmlChar* pName )
 {
     if( nNamespaceToken != FastToken::DONTKNOW )
     {
-        sal_Int32 nNameToken = GetToken( pName, nNameLen );
+        sal_Int32 nNameToken = GetToken( pName );
         if( nNameToken != FastToken::DONTKNOW )
             return nNamespaceToken | nNameToken;
     }
@@ -1231,17 +1218,17 @@ void FastSaxParserImpl::callbackStartElement(const 
xmlChar *localName , const xm
                 // attributes[] is ( localname / prefix / nsURI / valueBegin / 
valueEnd )
                 if( attributes[ i + 1 ] != nullptr )
                 {
-                    sal_Int32 nAttributeToken = GetTokenWithPrefix( 
attributes[ i + 1 ], strlen( XML_CAST( attributes[ i + 1 ] )), attributes[ i ], 
strlen( XML_CAST( attributes[ i ] )));
+                    sal_Int32 nAttributeToken = GetTokenWithPrefix(attributes[ 
i + 1 ], attributes[ i ]);
                     if( nAttributeToken != FastToken::DONTKNOW )
-                        rEvent.mxAttributes->add( nAttributeToken, XML_CAST( 
attributes[ i + 3 ] ), attributes[ i + 4 ] - attributes[ i + 3 ] );
+                        rEvent.mxAttributes->add( nAttributeToken, 
std::string_view(XML_CAST( attributes[ i + 3 ] ), attributes[ i + 4 ] - 
attributes[ i + 3 ]) );
                     else
                         addUnknownElementWithPrefix(attributes, i, 
rEvent.mxAttributes);
                 }
                 else
                 {
-                    sal_Int32 nAttributeToken = GetToken( attributes[ i ], 
strlen( XML_CAST( attributes[ i ] )));
+                    sal_Int32 nAttributeToken = GetToken(attributes[ i ]);
                     if( nAttributeToken != FastToken::DONTKNOW )
-                        rEvent.mxAttributes->add( nAttributeToken, XML_CAST( 
attributes[ i + 3 ] ), attributes[ i + 4 ] - attributes[ i + 3 ] );
+                        rEvent.mxAttributes->add( nAttributeToken, 
std::string_view(XML_CAST( attributes[ i + 3 ] ), attributes[ i + 4 ] - 
attributes[ i + 3 ]) );
                     else
                     {
                         SAL_WARN("xmloff", "unknown attribute " << XML_CAST( 
attributes[ i ] ) << "=" <<
@@ -1253,11 +1240,11 @@ void FastSaxParserImpl::callbackStartElement(const 
xmlChar *localName , const xm
             }
 
             if( prefix != nullptr )
-                rEvent.mnElementToken = GetTokenWithPrefix( prefix, strlen( 
XML_CAST( prefix )), localName, strlen( XML_CAST( localName )));
+                rEvent.mnElementToken = GetTokenWithPrefix(prefix, localName);
             else if( !sNamespace.isEmpty() )
-                rEvent.mnElementToken = GetTokenWithContextNamespace( 
nNamespaceToken, localName, strlen( XML_CAST( localName )));
+                rEvent.mnElementToken = 
GetTokenWithContextNamespace(nNamespaceToken, localName);
             else
-                rEvent.mnElementToken = GetToken( localName, strlen( XML_CAST( 
localName )));
+                rEvent.mnElementToken = GetToken(localName);
         }
         else
         {
diff --git a/sax/source/tools/fastattribs.cxx b/sax/source/tools/fastattribs.cxx
index 27d7e57f8ad5..917e9c8ab048 100644
--- a/sax/source/tools/fastattribs.cxx
+++ b/sax/source/tools/fastattribs.cxx
@@ -94,14 +94,14 @@ void FastAttributeList::clear()
     maUnknownAttributes.clear();
 }
 
-void FastAttributeList::add( sal_Int32 nToken, const char* pValue, size_t 
nValueLength )
+void FastAttributeList::add( sal_Int32 nToken, std::string_view value )
 {
     assert(nToken != -1);
     assert(nToken != 0);
-    assert(nValueLength < SAL_MAX_INT32); // protect against absurd values
+    assert(value.length() < SAL_MAX_INT32); // protect against absurd values
     maAttributeTokens.push_back( nToken );
     sal_Int32 nWritePosition = maAttributeValues.back();
-    maAttributeValues.push_back( maAttributeValues.back() + nValueLength + 1 );
+    maAttributeValues.push_back( maAttributeValues.back() + value.length() + 1 
);
     if (maAttributeValues.back() > mnChunkLength)
     {
         const sal_Int32 newLen = std::max(mnChunkLength * 2, 
maAttributeValues.back());
@@ -113,18 +113,8 @@ void FastAttributeList::add( sal_Int32 nToken, const char* 
pValue, size_t nValue
         mpChunk = p;
 
     }
-    memcpy(mpChunk + nWritePosition, pValue, nValueLength);
-    mpChunk[nWritePosition + nValueLength] = '\0';
-}
-
-void FastAttributeList::add( sal_Int32 nToken, const char* pValue )
-{
-    add( nToken, pValue, strlen( pValue ));
-}
-
-void FastAttributeList::add( sal_Int32 nToken, const OString& rValue )
-{
-    add( nToken, rValue.getStr(), rValue.getLength() );
+    memcpy(mpChunk + nWritePosition, value.data(), value.length());
+    mpChunk[nWritePosition + value.length()] = '\0';
 }
 
 void FastAttributeList::add(sal_Int32 nToken, std::u16string_view sValue)
@@ -132,7 +122,7 @@ void FastAttributeList::add(sal_Int32 nToken, 
std::u16string_view sValue)
     add(nToken, OUStringToOString(sValue, RTL_TEXTENCODING_UTF8));
 }
 
-void FastAttributeList::addNS( sal_Int32 nNamespaceToken, sal_Int32 nToken, 
const OString& rValue )
+void FastAttributeList::addNS( sal_Int32 nNamespaceToken, sal_Int32 nToken, 
std::string_view rValue )
 {
     sal_Int32 nCombinedToken = (nNamespaceToken << 16) | nToken;
     add( nCombinedToken, rValue );
@@ -164,7 +154,7 @@ void FastAttributeList::add( const 
css::uno::Reference<css::xml::sax::XFastAttri
 void FastAttributeList::add( const FastAttributeList& rOther )
 {
     for (size_t i=0; i < rOther.maAttributeTokens.size(); ++i)
-        add(rOther.maAttributeTokens[i], rOther.getFastAttributeValue(i), 
rOther.AttributeValueLength(i));
+        add(rOther.maAttributeTokens[i], rOther.getAsViewByIndex(i));
     for (const auto & i : rOther.maUnknownAttributes)
         addUnknown(i.maNamespaceURL, i.maName, i.maValue);
 }
@@ -185,8 +175,7 @@ sal_Int32 FastAttributeList::getValueToken( ::sal_Int32 
Token )
         if (maAttributeTokens[i] == Token)
             return FastTokenHandlerBase::getTokenFromChars(
                        mpTokenHandler,
-                       getFastAttributeValue(i),
-                       AttributeValueLength( i ) );
+                       getAsViewByIndex(i) );
 
     throw SAXException("FastAttributeList::getValueToken: unknown token " + 
OUString::number(Token), nullptr, Any());
 }
@@ -197,8 +186,7 @@ sal_Int32 FastAttributeList::getOptionalValueToken( 
::sal_Int32 Token, ::sal_Int
         if (maAttributeTokens[i] == Token)
             return FastTokenHandlerBase::getTokenFromChars(
                        mpTokenHandler,
-                       getFastAttributeValue(i),
-                       AttributeValueLength( i ) );
+                       getAsViewByIndex(i) );
 
     return Default;
 }
@@ -293,16 +281,9 @@ FastAttributeList::FastAttributeIter 
FastAttributeList::find( sal_Int32 nToken )
 
 sal_Int32 FastTokenHandlerBase::getTokenFromChars(
         const FastTokenHandlerBase *pTokenHandler,
-        const char *pToken, size_t nLen /* = 0 */ )
+        std::string_view token )
 {
-    sal_Int32 nRet;
-
-    if( !nLen )
-        nLen = strlen( pToken );
-
-    nRet = pTokenHandler->getTokenDirect( pToken, static_cast<sal_Int32>(nLen) 
);
-
-    return nRet;
+    return pTokenHandler->getTokenDirect(token.data(), token.size());
 }
 
 }
diff --git a/sax/source/tools/fastserializer.cxx 
b/sax/source/tools/fastserializer.cxx
index b4b9de8fb9c6..9461e784ca4a 100644
--- a/sax/source/tools/fastserializer.cxx
+++ b/sax/source/tools/fastserializer.cxx
@@ -99,9 +99,9 @@ namespace sax_fastparser {
 
     }
 
-    void FastSaxSerializer::write( const OString& sOutput, bool bEscape )
+    void FastSaxSerializer::write( std::string_view sOutput, bool bEscape )
     {
-        write( sOutput.getStr(), sOutput.getLength(), bEscape );
+        write( sOutput.data(), sOutput.length(), bEscape );
     }
 
     /** Characters not allowed in XML 1.0
diff --git a/sax/source/tools/fastserializer.hxx 
b/sax/source/tools/fastserializer.hxx
index c849e201872b..8d97caf305a4 100644
--- a/sax/source/tools/fastserializer.hxx
+++ b/sax/source/tools/fastserializer.hxx
@@ -113,7 +113,7 @@ public:
 
     void write( double value );
     void write( std::u16string_view s, bool bEscape = false );
-    void write( const OString& s, bool bEscape = false );
+    void write( std::string_view s, bool bEscape = false );
     void write( const char* pStr, sal_Int32 nLen, bool bEscape = false );
 
     // strings with _xHHHH_ are escaped with _x005F unless this is disabled
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx 
b/sw/source/filter/ww8/docxattributeoutput.cxx
index 2283c398f94f..ce6e28e26407 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -284,6 +284,11 @@ OUString NumberToHexBinary(sal_Int32 n)
     return aBuf.makeStringAndClear();
 }
 
+// Returns a new reference with the previous content of src; src is empty 
after this
+auto detachFrom(rtl::Reference<sax_fastparser::FastAttributeList>& src)
+{
+    return rtl::Reference(std::move(src));
+}
 }
 
 void DocxAttributeOutput::RTLAndCJKState( bool bIsRTL, sal_uInt16 /*nScript*/ )
@@ -298,28 +303,6 @@ static bool lcl_isOnelinerSdt(std::u16string_view rName)
     return rName == u"Title" || rName == u"Subtitle" || rName == u"Company";
 }
 
-void 
DocxAttributeOutput::AddToAttrList(rtl::Reference<sax_fastparser::FastAttributeList>&
 pAttrList, sal_Int32 nAttrs, ...)
-{
-    if (!pAttrList.is())
-        pAttrList = FastSerializerHelper::createAttrList();
-
-    va_list args;
-    va_start(args, nAttrs);
-    for (sal_Int32 i = 0; i < nAttrs; i++)
-    {
-        sal_Int32 nName = va_arg(args, sal_Int32);
-        const char* pValue = va_arg(args, const char*);
-        if (pValue)
-            pAttrList->add(nName, pValue);
-    }
-    va_end(args);
-}
-
-void 
DocxAttributeOutput::AddToAttrList(rtl::Reference<sax_fastparser::FastAttributeList>&
 pAttrList, sal_Int32 nAttrName, const char* sAttrValue)
-{
-    AddToAttrList(pAttrList, 1, nAttrName, sAttrValue);
-}
-
 // write a floating table directly to docx without the surrounding frame
 void DocxAttributeOutput::WriteFloatingTable(ww8::Frame const* pParentFrame)
 {
@@ -636,8 +619,7 @@ void SdtBlockHelper::WriteSdtBlock(const 
::sax_fastparser::FSHelperPtr& pSeriali
             pSerializer->startElement(m_nSdtPrToken);
         else
         {
-            rtl::Reference<FastAttributeList> xAttrList = 
std::move(m_pTokenAttributes);
-            pSerializer->startElement(m_nSdtPrToken, xAttrList);
+            pSerializer->startElement(m_nSdtPrToken, 
detachFrom(m_pTokenAttributes));
         }
 
         if (m_nSdtPrToken == FSNS(XML_w, XML_date) || m_nSdtPrToken == 
FSNS(XML_w, XML_docPartObj) || m_nSdtPrToken == FSNS(XML_w, XML_docPartList) || 
m_nSdtPrToken == FSNS(XML_w14, XML_checkbox)) {
@@ -654,8 +636,7 @@ void SdtBlockHelper::WriteSdtBlock(const 
::sax_fastparser::FSHelperPtr& pSeriali
             pSerializer->singleElement(m_nSdtPrToken);
         else
         {
-            rtl::Reference<FastAttributeList> xAttrList = 
std::move(m_pTokenAttributes);
-            pSerializer->singleElement(m_nSdtPrToken, xAttrList);
+            pSerializer->singleElement(m_nSdtPrToken, 
detachFrom(m_pTokenAttributes));
         }
     }
 
@@ -686,14 +667,12 @@ void SdtBlockHelper::WriteExtraParams(const 
::sax_fastparser::FSHelperPtr& pSeri
 
     if (m_pDataBindingAttrs.is())
     {
-        rtl::Reference<FastAttributeList> xAttrList = 
std::move(m_pDataBindingAttrs);
-        pSerializer->singleElementNS(XML_w, XML_dataBinding, xAttrList);
+        pSerializer->singleElementNS(XML_w, XML_dataBinding, 
detachFrom(m_pDataBindingAttrs));
     }
 
     if (m_pTextAttrs.is())
     {
-        rtl::Reference<FastAttributeList> xAttrList = std::move(m_pTextAttrs);
-        pSerializer->singleElementNS(XML_w, XML_text, xAttrList);
+        pSerializer->singleElementNS(XML_w, XML_text, 
detachFrom(m_pTextAttrs));
     }
 
     if (!m_aPlaceHolderDocPart.isEmpty())
@@ -746,42 +725,34 @@ void SdtBlockHelper::GetSdtParamsFromGrabBag(const 
uno::Sequence<beans::Property
             m_nSdtPrToken = FSNS(XML_w14, XML_checkbox);
             uno::Sequence<beans::PropertyValue> aGrabBag;
             aPropertyValue.Value >>= aGrabBag;
-            for (const auto& rProp : std::as_const(aGrabBag))
+            for (const auto& rProp : aGrabBag)
             {
-                OUString sValue = rProp.Value.get<OUString>();
                 if (rProp.Name == "ooxml:CT_SdtCheckbox_checked")
                     DocxAttributeOutput::AddToAttrList(m_pTokenChildren,
-                        FSNS(XML_w14, XML_checked),
-                        OUStringToOString(sValue, 
RTL_TEXTENCODING_UTF8).getStr());
+                        FSNS(XML_w14, XML_checked), 
rProp.Value.get<OUString>());
                 else if (rProp.Name == "ooxml:CT_SdtCheckbox_checkedState")
                     DocxAttributeOutput::AddToAttrList(m_pTokenChildren,
-                        FSNS(XML_w14, XML_checkedState),
-                        OUStringToOString(sValue, 
RTL_TEXTENCODING_UTF8).getStr());
+                        FSNS(XML_w14, XML_checkedState), 
rProp.Value.get<OUString>());
                 else if (rProp.Name == "ooxml:CT_SdtCheckbox_uncheckedState")
                     DocxAttributeOutput::AddToAttrList(m_pTokenChildren,
-                        FSNS(XML_w14, XML_uncheckedState),
-                        OUStringToOString(sValue, 
RTL_TEXTENCODING_UTF8).getStr());
+                        FSNS(XML_w14, XML_uncheckedState), 
rProp.Value.get<OUString>());
             }
         }
         else if (aPropertyValue.Name == "ooxml:CT_SdtPr_dataBinding" && 
!m_pDataBindingAttrs.is())
         {
             uno::Sequence<beans::PropertyValue> aGrabBag;
             aPropertyValue.Value >>= aGrabBag;
-            for (const auto& rProp : std::as_const(aGrabBag))
+            for (const auto& rProp : aGrabBag)
             {
-                OUString sValue = rProp.Value.get<OUString>();
                 if (rProp.Name == "ooxml:CT_DataBinding_prefixMappings")
                     DocxAttributeOutput::AddToAttrList( m_pDataBindingAttrs,
-                                    FSNS( XML_w, XML_prefixMappings ),
-                                    OUStringToOString( sValue, 
RTL_TEXTENCODING_UTF8 ).getStr() );
+                                    FSNS( XML_w, XML_prefixMappings ), 
rProp.Value.get<OUString>());
                 else if (rProp.Name == "ooxml:CT_DataBinding_xpath")
                     DocxAttributeOutput::AddToAttrList( m_pDataBindingAttrs,
-                                    FSNS( XML_w, XML_xpath ),
-                                    OUStringToOString( sValue, 
RTL_TEXTENCODING_UTF8 ).getStr() );
+                                    FSNS( XML_w, XML_xpath ), 
rProp.Value.get<OUString>());
                 else if (rProp.Name == "ooxml:CT_DataBinding_storeItemID")
                     DocxAttributeOutput::AddToAttrList( m_pDataBindingAttrs,
-                                    FSNS( XML_w, XML_storeItemID ),
-                                    OUStringToOString( sValue, 
RTL_TEXTENCODING_UTF8 ).getStr() );
+                                    FSNS( XML_w, XML_storeItemID ), 
rProp.Value.get<OUString>());
             }
         }
         else if (aPropertyValue.Name == "ooxml:CT_SdtPr_text")
@@ -790,13 +761,11 @@ void SdtBlockHelper::GetSdtParamsFromGrabBag(const 
uno::Sequence<beans::Property
             aPropertyValue.Value >>= aGrabBag;
             if (aGrabBag.hasElements())
             {
-                for (const auto& rProp : std::as_const(aGrabBag))
+                for (const auto& rProp : aGrabBag)
                 {
-                    OUString sValue = rProp.Value.get<OUString>();
                     if (rProp.Name == "ooxml:CT_SdtText_multiLine")
                         DocxAttributeOutput::AddToAttrList(m_pTextAttrs,
-                            FSNS(XML_w, XML_multiLine),
-                            OUStringToOString(sValue, 
RTL_TEXTENCODING_UTF8).getStr());
+                            FSNS(XML_w, XML_multiLine), 
rProp.Value.get<OUString>());
                 }
             }
             else
@@ -874,23 +843,21 @@ void SdtBlockHelper::GetSdtParamsFromGrabBag(const 
uno::Sequence<beans::Property
 
             uno::Sequence<beans::PropertyValue> aGrabBag;
             aPropertyValue.Value >>= aGrabBag;
-            for (const auto& rProp : std::as_const(aGrabBag))
+            for (const auto& rProp : aGrabBag)
             {
-                OUString sValue = rProp.Value.get<OUString>();
                 if (rProp.Name == "ooxml:CT_SdtDocPart_docPartGallery")
                     DocxAttributeOutput::AddToAttrList(m_pTokenChildren,
-                        FSNS(XML_w, XML_docPartGallery),
-                        OUStringToOString(sValue, 
RTL_TEXTENCODING_UTF8).getStr());
+                        FSNS(XML_w, XML_docPartGallery), 
rProp.Value.get<OUString>());
                 else if (rProp.Name == "ooxml:CT_SdtDocPart_docPartCategory")
                     DocxAttributeOutput::AddToAttrList(m_pTokenChildren,
-                        FSNS(XML_w, XML_docPartCategory),
-                        OUStringToOString(sValue, 
RTL_TEXTENCODING_UTF8).getStr());
+                        FSNS(XML_w, XML_docPartCategory), 
rProp.Value.get<OUString>());
                 else if (rProp.Name == "ooxml:CT_SdtDocPart_docPartUnique")
                 {
+                    OUString sValue = rProp.Value.get<OUString>();
                     if (sValue.isEmpty())
                         sValue = "true";
                     DocxAttributeOutput::AddToAttrList(m_pTokenChildren, 
FSNS(XML_w, XML_docPartUnique),
-                        OUStringToOString(sValue, 
RTL_TEXTENCODING_UTF8).getStr());
+                        sValue);
                 }
             }
         }
@@ -1372,28 +1339,23 @@ void 
DocxAttributeOutput::WriteCollectedParagraphProperties()
 {
     if ( m_rExport.SdrExporter().getFlyAttrList().is() )
     {
-        rtl::Reference<FastAttributeList> xAttrList( 
m_rExport.SdrExporter().getFlyAttrList() );
-        m_rExport.SdrExporter().getFlyAttrList().clear();
-
-        m_pSerializer->singleElementNS( XML_w, XML_framePr, xAttrList );
+        m_pSerializer->singleElementNS( XML_w, XML_framePr,
+                                        
detachFrom(m_rExport.SdrExporter().getFlyAttrList() ) );
     }
 
     if (m_pLRSpaceAttrList.is())
     {
-        rtl::Reference<FastAttributeList> xAttrList = 
std::move(m_pLRSpaceAttrList);
-        m_pSerializer->singleElementNS(XML_w, XML_ind, xAttrList);
+        m_pSerializer->singleElementNS(XML_w, XML_ind, 
detachFrom(m_pLRSpaceAttrList));
     }
 
     if ( m_pParagraphSpacingAttrList.is() )
     {
-        rtl::Reference<FastAttributeList> xAttrList = std::move( 
m_pParagraphSpacingAttrList );
-        m_pSerializer->singleElementNS( XML_w, XML_spacing, xAttrList );
+        m_pSerializer->singleElementNS( XML_w, XML_spacing, detachFrom( 
m_pParagraphSpacingAttrList ) );
     }
 
     if ( m_pBackgroundAttrList.is() )
     {
-        rtl::Reference<FastAttributeList> xAttrList = std::move( 
m_pBackgroundAttrList );
-        m_pSerializer->singleElementNS( XML_w, XML_shd, xAttrList );
+        m_pSerializer->singleElementNS( XML_w, XML_shd, detachFrom( 
m_pBackgroundAttrList ) );
     }
 }
 
@@ -1486,12 +1448,9 @@ void DocxAttributeOutput::EndParagraphProperties(const 
SfxItemSet& rParagraphMar
     // to the DOCX when the function 'WriteCollectedRunProperties' gets called.
     // So we need to store the current status of these lists, so that we can 
revert back to them when
     // we are done exporting the redline attributes.
-    rtl::Reference<sax_fastparser::FastAttributeList> 
pFontsAttrList_Original(m_pFontsAttrList);
-    m_pFontsAttrList.clear();
-    rtl::Reference<sax_fastparser::FastAttributeList> 
pEastAsianLayoutAttrList_Original(m_pEastAsianLayoutAttrList);
-    m_pEastAsianLayoutAttrList.clear();
-    rtl::Reference<sax_fastparser::FastAttributeList> 
pCharLangAttrList_Original(m_pCharLangAttrList);
-    m_pCharLangAttrList.clear();
+    auto pFontsAttrList_Original(detachFrom(m_pFontsAttrList));
+    auto 
pEastAsianLayoutAttrList_Original(detachFrom(m_pEastAsianLayoutAttrList));
+    auto pCharLangAttrList_Original(detachFrom(m_pCharLangAttrList));
 
     lcl_writeParagraphMarkerProperties(*this, rParagraphMarkerProperties);
 
@@ -1499,9 +1458,9 @@ void DocxAttributeOutput::EndParagraphProperties(const 
SfxItemSet& rParagraphMar
     WriteCollectedRunProperties();
 
     // Revert back the original values that were stored in 'm_pFontsAttrList', 
'm_pEastAsianLayoutAttrList', 'm_pCharLangAttrList'
-    m_pFontsAttrList = pFontsAttrList_Original.get();
-    m_pEastAsianLayoutAttrList = pEastAsianLayoutAttrList_Original.get();
-    m_pCharLangAttrList = pCharLangAttrList_Original.get();
+    m_pFontsAttrList = std::move(pFontsAttrList_Original);
+    m_pEastAsianLayoutAttrList = std::move(pEastAsianLayoutAttrList_Original);
+    m_pCharLangAttrList = std::move(pCharLangAttrList_Original);
 
     if ( pRedlineParagraphMarkerDeleted )
     {
@@ -1765,9 +1724,7 @@ void DocxAttributeOutput::EndRun(const SwTextNode* pNode, 
sal_Int32 nPos, sal_In
         }
         newStartedHyperlink = true;
 
-        rtl::Reference<FastAttributeList> xAttrList = std::move( 
m_pHyperlinkAttrList );
-
-        m_pSerializer->startElementNS( XML_w, XML_hyperlink, xAttrList );
+        m_pSerializer->startElementNS( XML_w, XML_hyperlink, detachFrom( 
m_pHyperlinkAttrList ) );
         m_startedHyperlink = true;
         m_nHyperLinkCount.top()++;
     }
@@ -1984,7 +1941,7 @@ void DocxAttributeOutput::DoWriteBookmarkTagEnd(sal_Int32 
const nId)
         FSNS(XML_w, XML_id), OString::number(nId));
 }
 
-void DocxAttributeOutput::DoWriteMoveRangeTagStart(const OString & 
bookmarkName,
+void DocxAttributeOutput::DoWriteMoveRangeTagStart(std::u16string_view 
bookmarkName,
     bool bFrom, const SwRedlineData* pRedlineData)
 {
     bool bRemovePersonalInfo = SvtSecurityOptions::IsOptionSet(
@@ -2031,7 +1988,7 @@ void 
DocxAttributeOutput::DoWriteBookmarkStartIfExist(sal_Int32 nRunPos)
     {
         DoWriteBookmarkTagStart(aIter->second);
         m_rOpenedBookmarksIds[aIter->second] = m_nNextBookmarkId;
-        m_sLastOpenedBookmark = 
OUStringToOString(BookmarkToWord(aIter->second), RTL_TEXTENCODING_UTF8);
+        m_sLastOpenedBookmark = BookmarkToWord(aIter->second);
         m_nNextBookmarkId++;
     }
 }
@@ -2060,8 +2017,7 @@ void 
DocxAttributeOutput::DoWriteBookmarksStart(std::vector<OUString>& rStarts,
         // Output the bookmark (including MoveBookmark of the tracked moving)
         bool bMove = false;
         bool bFrom = false;
-        OString sBookmarkName = OUStringToOString(
-                BookmarkToWord(bookmarkName, &bMove, &bFrom), 
RTL_TEXTENCODING_UTF8);
+        OUString sBookmarkName = BookmarkToWord(bookmarkName, &bMove, &bFrom);
         if ( bMove )
         {
             // TODO: redline data of MoveBookmark is restored from the first 
redline of the bookmark
@@ -2214,7 +2170,7 @@ void DocxAttributeOutput::DoWriteAnnotationMarks()
     for ( const auto & rName : m_rAnnotationMarksEnd )
     {
         // Get the id of the annotation mark
-        std::map< OString, sal_Int32 >::iterator pPos = 
m_rOpenedAnnotationMarksIds.find( rName );
+        auto pPos = m_rOpenedAnnotationMarksIds.find( rName );
         if ( pPos != m_rOpenedAnnotationMarksIds.end(  ) )
         {
             const sal_Int32 nId = ( *pPos ).second;
@@ -2574,7 +2530,7 @@ void DocxAttributeOutput::WriteContentControlEnd()
 }
 
 void DocxAttributeOutput::WriteSdtDropDownStart(
-        std::u16string_view rName,
+        OUString const& rName,
         OUString const& rSelected,
         uno::Sequence<OUString> const& rListItems)
 {
@@ -2582,7 +2538,7 @@ void DocxAttributeOutput::WriteSdtDropDownStart(
     m_pSerializer->startElementNS(XML_w, XML_sdtPr);
 
     m_pSerializer->singleElementNS(XML_w, XML_alias,
-        FSNS(XML_w, XML_val), OUStringToOString(rName, RTL_TEXTENCODING_UTF8));
+        FSNS(XML_w, XML_val), rName);
 
     sal_Int32 nId = comphelper::findValue(rListItems, rSelected);
     if (nId == -1)
@@ -3302,27 +3258,23 @@ void DocxAttributeOutput::WriteCollectedRunProperties()
     // Write all differed properties
     if ( m_pFontsAttrList.is() )
     {
-        rtl::Reference<FastAttributeList> xAttrList = std::move( 
m_pFontsAttrList );
-        m_pSerializer->singleElementNS( XML_w, XML_rFonts, xAttrList );
+        m_pSerializer->singleElementNS( XML_w, XML_rFonts, detachFrom( 
m_pFontsAttrList ) );
     }
 
     if ( m_pColorAttrList.is() )
     {
-        rtl::Reference<FastAttributeList> xAttrList( m_pColorAttrList );
-
-        m_pSerializer->singleElementNS( XML_w, XML_color, xAttrList );
+        m_pSerializer->singleElementNS( XML_w, XML_color, m_pColorAttrList );
     }
 
     if ( m_pEastAsianLayoutAttrList.is() )
     {
-        rtl::Reference<FastAttributeList> xAttrList = std::move( 
m_pEastAsianLayoutAttrList );
-        m_pSerializer->singleElementNS( XML_w, XML_eastAsianLayout, xAttrList 
);
+        m_pSerializer->singleElementNS( XML_w, XML_eastAsianLayout,
+                                        detachFrom(m_pEastAsianLayoutAttrList 
) );
     }
 
     if ( m_pCharLangAttrList.is() )
     {
-        rtl::Reference<FastAttributeList> xAttrList = std::move( 
m_pCharLangAttrList );
-        m_pSerializer->singleElementNS( XML_w, XML_lang, xAttrList );
+        m_pSerializer->singleElementNS( XML_w, XML_lang, detachFrom( 
m_pCharLangAttrList ) );
     }
 
     if (m_nCharTransparence != 0 && m_pColorAttrList && 
m_aTextEffectsGrabBag.empty())
@@ -3701,16 +3653,15 @@ bool DocxAttributeOutput::StartURL( const OUString& 
rUrl, const OUString& rTarge
 
         if ( !bBookmarkOnly )
         {
-            OString sId = OUStringToOString( 
GetExport().GetFilter().addRelation( m_pSerializer->getOutputStream(),
+            OUString sId = GetExport().GetFilter().addRelation( 
m_pSerializer->getOutputStream(),
                         oox::getRelationship(Relationship::HYPERLINK),
-                        sUrl, true ), RTL_TEXTENCODING_UTF8 );
+                        sUrl, true );
 
             m_pHyperlinkAttrList->add(FSNS(XML_r, XML_id), sId);
             if (!sMark.isEmpty())
             {
                 sMark = sMark.replace(' ', '_');
-                m_pHyperlinkAttrList->add(FSNS(XML_w, XML_anchor),
-                                          OUStringToOString(sMark, 
RTL_TEXTENCODING_UTF8));
+                m_pHyperlinkAttrList->add(FSNS(XML_w, XML_anchor), sMark);
             }
         }
         else
@@ -3727,13 +3678,13 @@ bool DocxAttributeOutput::StartURL( const OUString& 
rUrl, const OUString& rTarge
                     OUString aSequenceName = sMark.copy(0, nPos);
                     // Extract <index>.
                     sal_uInt32 nIndex = o3tl::toUInt32(sMark.subView(nPos + 1, 
sMark.getLength() - nPos - sizeof("|sequence")));
-                    std::map<OUString, std::vector<OString> >::iterator it = 
m_aSeqBookmarksNames.find(aSequenceName);
+                    auto it = m_aSeqBookmarksNames.find(aSequenceName);
                     if (it != m_aSeqBookmarksNames.end())
                     {
-                        std::vector<OString>& rNames = it->second;
+                        std::vector<OUString>& rNames = it->second;
                         if (rNames.size() > nIndex)
                             // We know the bookmark name for this sequence and 
this index, do the replacement.
-                            sMark = OStringToOUString(rNames[nIndex], 
RTL_TEXTENCODING_UTF8);
+                            sMark = rNames[nIndex];
                     }
                 }
             }
@@ -3747,14 +3698,12 @@ bool DocxAttributeOutput::StartURL( const OUString& 
rUrl, const OUString& rTarge
             }
             // Spaces are prohibited in bookmark name.
             sMark = sMark.replace(' ', '_');
-            m_pHyperlinkAttrList->add( FSNS( XML_w, XML_anchor ),
-                    OUStringToOString( sMark, RTL_TEXTENCODING_UTF8 ) );
+            m_pHyperlinkAttrList->add( FSNS( XML_w, XML_anchor ), sMark );
         }
 
         if ( !rTarget.isEmpty() )
         {
-            OString soTarget = OUStringToOString( rTarget, 
RTL_TEXTENCODING_UTF8 );
-            m_pHyperlinkAttrList->add(FSNS(XML_w, XML_tgtFrame), soTarget);
+            m_pHyperlinkAttrList->add(FSNS(XML_w, XML_tgtFrame), rTarget);
         }
     }
 
@@ -3897,12 +3846,9 @@ void DocxAttributeOutput::Redline( const SwRedlineData* 
pRedlineData)
                     // to the DOCX when the function 
'WriteCollectedParagraphProperties' gets called.
                     // So we need to store the current status of these lists, 
so that we can revert back to them when
                     // we are done exporting the redline attributes.
-                    rtl::Reference<sax_fastparser::FastAttributeList> 
pFlyAttrList_Original(m_rExport.SdrExporter().getFlyAttrList());
-                    m_rExport.SdrExporter().getFlyAttrList().clear();
-                    rtl::Reference<sax_fastparser::FastAttributeList> 
pLRSpaceAttrList_Original(m_pLRSpaceAttrList);
-                    m_pLRSpaceAttrList.clear();
-                    rtl::Reference<sax_fastparser::FastAttributeList> 
pParagraphSpacingAttrList_Original(m_pParagraphSpacingAttrList);
-                    m_pParagraphSpacingAttrList.clear();
+                    auto 
pFlyAttrList_Original(detachFrom(m_rExport.SdrExporter().getFlyAttrList()));
+                    auto 
pLRSpaceAttrList_Original(detachFrom(m_pLRSpaceAttrList));
+                    auto 
pParagraphSpacingAttrList_Original(detachFrom(m_pParagraphSpacingAttrList));
 
                     // Output the redline item set
                     if (pChangesSet)
@@ -3912,9 +3858,9 @@ void DocxAttributeOutput::Redline( const SwRedlineData* 
pRedlineData)
                     WriteCollectedParagraphProperties();
 
                     // Revert back the original values that were stored in 
'm_rExport.SdrExporter().getFlyAttrList()', 'm_pParagraphSpacingAttrList'
-                    m_rExport.SdrExporter().getFlyAttrList() = 
pFlyAttrList_Original;
-                    m_pLRSpaceAttrList = pLRSpaceAttrList_Original;
-                    m_pParagraphSpacingAttrList = 
pParagraphSpacingAttrList_Original;
+                    m_rExport.SdrExporter().getFlyAttrList() = 
std::move(pFlyAttrList_Original);
+                    m_pLRSpaceAttrList = std::move(pLRSpaceAttrList_Original);
+                    m_pParagraphSpacingAttrList = 
std::move(pParagraphSpacingAttrList_Original);
 
                     m_pSerializer->endElementNS( XML_w, XML_pPr );
 
@@ -4115,7 +4061,7 @@ static void impl_borderLine( FSHelperPtr const & 
pSerializer, sal_Int32 elementT
         return;
 
     rtl::Reference<FastAttributeList> pAttr = 
FastSerializerHelper::createAttrList();
-    pAttr->add( FSNS( XML_w, XML_val ), OString( pVal ) );
+    pAttr->add( FSNS( XML_w, XML_val ), pVal );
 
     if ( pBorderLine && !pBorderLine->isEmpty() )
     {
@@ -4587,13 +4533,12 @@ void DocxAttributeOutput::LatentStyles()
     for (const auto& rLatentStyle : std::as_const(aLatentStyles))
     {
         if (sal_Int32 nToken = DocxStringGetToken(aDefaultTokens, 
rLatentStyle.Name))
-            pAttributeList->add(FSNS(XML_w, nToken), 
OUStringToOString(rLatentStyle.Value.get<OUString>(), RTL_TEXTENCODING_UTF8));
+            pAttributeList->add(FSNS(XML_w, nToken), 
rLatentStyle.Value.get<OUString>());
         else if (rLatentStyle.Name == "lsdExceptions")
             rLatentStyle.Value >>= aLsdExceptions;
     }
 
-    m_pSerializer->startElementNS(XML_w, XML_latentStyles, pAttributeList);
-    pAttributeList = nullptr;
+    m_pSerializer->startElementNS(XML_w, XML_latentStyles, 
detachFrom(pAttributeList));
 
     // Then handle the exceptions.
     for (const auto& rLsdException : std::as_const(aLsdExceptions))
@@ -4604,10 +4549,9 @@ void DocxAttributeOutput::LatentStyles()
         rLsdException.Value >>= aAttributes;
         for (const auto& rAttribute : std::as_const(aAttributes))
             if (sal_Int32 nToken = DocxStringGetToken(aExceptionTokens, 
rAttribute.Name))
-                pAttributeList->add(FSNS(XML_w, nToken), 
OUStringToOString(rAttribute.Value.get<OUString>(), RTL_TEXTENCODING_UTF8));
+                pAttributeList->add(FSNS(XML_w, nToken), 
rAttribute.Value.get<OUString>());
 
-        m_pSerializer->singleElementNS(XML_w, XML_lsdException, 
pAttributeList);
-        pAttributeList = nullptr;
+        m_pSerializer->singleElementNS(XML_w, XML_lsdException, 
detachFrom(pAttributeList));
     }
 
     m_pSerializer->endElementNS(XML_w, XML_latentStyles);
@@ -4905,12 +4849,12 @@ static 
rtl::Reference<::sax_fastparser::FastAttributeList> CreateDocPrAttrList(
     std::u16string_view const& rTitle, std::u16string_view const& rDescription)
 {
     rtl::Reference<::sax_fastparser::FastAttributeList> const 
pAttrs(FastSerializerHelper::createAttrList());
-    pAttrs->add(XML_id, OString::number(nAnchorId).getStr());
-    pAttrs->add(XML_name, OUStringToOString(rName, RTL_TEXTENCODING_UTF8));
+    pAttrs->add(XML_id, OString::number(nAnchorId));
+    pAttrs->add(XML_name, rName);
     if (rExport.GetFilter().getVersion() != oox::core::ECMA_376_1ST_EDITION)
     {
-        pAttrs->add(XML_descr, OUStringToOString(rDescription, 
RTL_TEXTENCODING_UTF8));
-        pAttrs->add(XML_title, OUStringToOString(rTitle, 
RTL_TEXTENCODING_UTF8));
+        pAttrs->add(XML_descr, rDescription);
+        pAttrs->add(XML_title, rTitle);
     }
     else
     {   // tdf#148952 no title attribute, merge it into descr
@@ -4918,8 +4862,8 @@ static 
rtl::Reference<::sax_fastparser::FastAttributeList> CreateDocPrAttrList(
             ? OUString(rDescription)
             : rDescription.empty()
                 ? OUString(rTitle)
-                : OUString::Concat(rTitle) + OUString::Concat("\n") + 
OUString::Concat(rDescription));
-        pAttrs->add(XML_descr, OUStringToOString(value, 
RTL_TEXTENCODING_UTF8));
+                : OUString::Concat(rTitle) + "\n" + rDescription);
+        pAttrs->add(XML_descr, value);
     }
     return pAttrs;
 }
@@ -5055,7 +4999,6 @@ void DocxAttributeOutput::FlyFrameGraphic( const 
SwGrfNode* pGrfNode, const Size
             m_pSerializer->startElementNS(XML_a, XML_ext,
                 // Word uses this "URI" which is obviously not a URI
                 XML_uri, "{C183D7F6-B498-43B3-948B-1728B52AA6E4}");
-            rtl::Reference<::sax_fastparser::FastAttributeList> 
pAttrs(FastSerializerHelper::createAttrList());
             m_pSerializer->singleElementNS(XML_adec, XML_decorative,
                 FSNS(XML_xmlns, XML_adec), 
"http://schemas.microsoft.com/office/drawing/2017/decorative";,
                 XML_val, "1");
@@ -5347,7 +5290,7 @@ void DocxAttributeOutput::WritePostponedFormControl(const 
SdrObject* pObject)
             bHasDate = true;
             Date aDate(aUNODate.Day, aUNODate.Month, aUNODate.Year);
             sDate = DateToOString(aDate);
-            aContentText = 
OUString::createFromAscii(DateToDDMMYYYYOString(aDate).getStr());
+            aContentText = 
OUString::createFromAscii(DateToDDMMYYYYOString(aDate));
             sDateFormat = "dd/MM/yyyy";
         }
         else
@@ -5650,7 +5593,7 @@ void DocxAttributeOutput::WriteOLE( SwOLENode& rNode, 
const Size& rSize, const S
     m_pSerializer->singleElementNS(XML_o, XML_OLEObject,
                                    XML_Type, "Embed",
                                    XML_ProgID, sProgID,
-                                   XML_ShapeID, sShapeId.getStr(),
+                                   XML_ShapeID, sShapeId,
                                    XML_DrawAspect, sDrawAspect,
                                    XML_ObjectID, "_" + 
OString::number(comphelper::rng::uniform_int_distribution(0, 
std::numeric_limits<int>::max())),
                                    FSNS( XML_r, XML_id ), sId );
@@ -5659,7 +5602,7 @@ void DocxAttributeOutput::WriteOLE( SwOLENode& rNode, 
const Size& rSize, const S
 }
 
 void DocxAttributeOutput::WriteOLEShape(const SwFlyFrameFormat& rFrameFormat, 
const Size& rSize,
-                                        const OString& rShapeId, const 
OUString& rImageId)
+                                        std::string_view rShapeId, const 
OUString& rImageId)
 {
     assert(m_pSerializer);
 
@@ -5669,7 +5612,7 @@ void DocxAttributeOutput::WriteOLEShape(const 
SwFlyFrameFormat& rFrameFormat, co
 
     //export the fixed shape type for picture frame
     m_pSerializer->write(vml::VMLExport::GetVMLShapeTypeDefinition(rShapeId, 
true));
-    pAttr->add(XML_type, "_x0000_t" + rShapeId);
+    pAttr->add(XML_type, OString::Concat("_x0000_t") + rShapeId);
 
     //Export the style attribute for position and size
     pAttr->add(XML_style, GetOLEStyle(rFrameFormat, rSize));
@@ -6724,8 +6667,7 @@ void DocxAttributeOutput::EndSection()
     // Write the section properties
     if ( m_pSectionSpacingAttrList.is() )
     {
-        rtl::Reference<FastAttributeList> xAttrList = std::move( 
m_pSectionSpacingAttrList );
-        m_pSerializer->singleElementNS( XML_w, XML_pgMar, xAttrList );
+        m_pSerializer->singleElementNS( XML_w, XML_pgMar, detachFrom( 
m_pSectionSpacingAttrList ) );
     }
 
     // Order the elements
@@ -6790,13 +6732,13 @@ void DocxAttributeOutput::WriteLineBreak()
 void DocxAttributeOutput::SectionLineNumbering( sal_uLong nRestartNo, const 
SwLineNumberInfo& rLnNumInfo )
 {
     rtl::Reference<FastAttributeList> pAttr = 
FastSerializerHelper::createAttrList();
-    pAttr->add( FSNS( XML_w, XML_countBy ), 
OString::number(rLnNumInfo.GetCountBy()).getStr());
+    pAttr->add( FSNS( XML_w, XML_countBy ), 
OString::number(rLnNumInfo.GetCountBy()));
     pAttr->add( FSNS( XML_w, XML_restart ), rLnNumInfo.IsRestartEachPage() ? 
"newPage" : "continuous" );
     if( rLnNumInfo.GetPosFromLeft())
-        pAttr->add( FSNS( XML_w, XML_distance ), 
OString::number(rLnNumInfo.GetPosFromLeft()).getStr());
+        pAttr->add( FSNS( XML_w, XML_distance ), 
OString::number(rLnNumInfo.GetPosFromLeft()));
     if (nRestartNo > 0)
         // Writer is 1-based, Word is 0-based.
-        pAttr->add(FSNS(XML_w, XML_start), OString::number(nRestartNo - 
1).getStr());
+        pAttr->add(FSNS(XML_w, XML_start), OString::number(nRestartNo - 1));
     m_pSerializer->singleElementNS( XML_w, XML_lnNumType, pAttr );
 }
 
@@ -7542,7 +7484,7 @@ void DocxAttributeOutput::CharColor( const SvxColorItem& 
rColor )
         return;
     }
 
-    AddToAttrList( m_pColorAttrList, FSNS( XML_w, XML_val ), 
aColorString.getStr() );
+    AddToAttrList( m_pColorAttrList, FSNS( XML_w, XML_val ), aColorString );
     m_nCharTransparence = 255 - aColor.GetAlpha();
 }
 
@@ -7633,8 +7575,7 @@ void DocxAttributeOutput::CharFont( const SvxFontItem& 
rFont)
 {
     GetExport().GetId( rFont ); // ensure font info is written to fontTable.xml
     const OUString& sFontName(rFont.GetFamilyName());
-    const OString sFontNameUtf8 = OUStringToOString(sFontName, 
RTL_TEXTENCODING_UTF8);
-    if (sFontNameUtf8.isEmpty())
+    if (sFontName.isEmpty())
         return;
 
     if (m_pFontsAttrList &&
@@ -7648,9 +7589,9 @@ void DocxAttributeOutput::CharFont( const SvxFontItem& 
rFont)
         return;
     }
 
-    AddToAttrList( m_pFontsAttrList, 2,
-        FSNS( XML_w, XML_ascii ), sFontNameUtf8.getStr(),
-        FSNS( XML_w, XML_hAnsi ), sFontNameUtf8.getStr() );
+    AddToAttrList( m_pFontsAttrList,
+        FSNS( XML_w, XML_ascii ), sFontName,
+        FSNS( XML_w, XML_hAnsi ), sFontName );
 }
 
 void DocxAttributeOutput::CharFontSize( const SvxFontHeightItem& rFontSize)
@@ -7677,20 +7618,18 @@ void DocxAttributeOutput::CharKerning( const 
SvxKerningItem& rKerning )
 
 void DocxAttributeOutput::CharLanguage( const SvxLanguageItem& rLanguage )
 {
-    OString aLanguageCode( OUStringToOString(
-                LanguageTag( rLanguage.GetLanguage()).getBcp47MS(),
-                RTL_TEXTENCODING_UTF8));
+    OUString aLanguageCode(LanguageTag( rLanguage.GetLanguage()).getBcp47MS());
 
     switch ( rLanguage.Which() )
     {
         case RES_CHRATR_LANGUAGE:
-            AddToAttrList( m_pCharLangAttrList, FSNS( XML_w, XML_val ), 
aLanguageCode.getStr() );
+            AddToAttrList( m_pCharLangAttrList, FSNS( XML_w, XML_val ), 
aLanguageCode );
             break;
         case RES_CHRATR_CJK_LANGUAGE:
-            AddToAttrList( m_pCharLangAttrList, FSNS( XML_w, XML_eastAsia ), 
aLanguageCode.getStr() );
+            AddToAttrList( m_pCharLangAttrList, FSNS( XML_w, XML_eastAsia ), 
aLanguageCode );
             break;
         case RES_CHRATR_CTL_LANGUAGE:
-            AddToAttrList( m_pCharLangAttrList, FSNS( XML_w, XML_bidi ), 
aLanguageCode.getStr() );
+            AddToAttrList( m_pCharLangAttrList, FSNS( XML_w, XML_bidi ), 
aLanguageCode );
             break;
     }
 }
@@ -7809,9 +7748,7 @@ void DocxAttributeOutput::CharFontCJK( const SvxFontItem& 
rFont )
         return;
     }
 
-    const OUString& sFontName(rFont.GetFamilyName());
-    OString sFontNameUtf8 = OUStringToOString(sFontName, 
RTL_TEXTENCODING_UTF8);
-    AddToAttrList( m_pFontsAttrList, FSNS( XML_w, XML_eastAsia ), 
sFontNameUtf8.getStr() );
+    AddToAttrList( m_pFontsAttrList, FSNS( XML_w, XML_eastAsia ), 
rFont.GetFamilyName() );
 }
 
 void DocxAttributeOutput::CharPostureCJK( const SvxPostureItem& rPosture )
@@ -7840,9 +7777,7 @@ void DocxAttributeOutput::CharFontCTL( const SvxFontItem& 
rFont )
         return;
     }
 
-    const OUString& sFontName(rFont.GetFamilyName());
-    OString sFontNameUtf8 = OUStringToOString(sFontName, 
RTL_TEXTENCODING_UTF8);
-    AddToAttrList( m_pFontsAttrList, FSNS( XML_w, XML_cs ), 
sFontNameUtf8.getStr() );
+    AddToAttrList( m_pFontsAttrList, FSNS( XML_w, XML_cs ), 
rFont.GetFamilyName() );
 }
 
 void DocxAttributeOutput::CharPostureCTL( const SvxPostureItem& rPosture)
@@ -7913,7 +7848,7 @@ void DocxAttributeOutput::CharTwoLines( const 
SvxTwoLinesItem& rTwoLines )
     if (!cStart && !cEnd)
         return;
 
-    const char* sBracket;
+    std::string_view sBracket;
     if ((cStart == '{') || (cEnd == '}'))
         sBracket = "curly";
     else if ((cStart == '<') || (cEnd == '>'))
@@ -8030,9 +7965,8 @@ void DocxAttributeOutput::PostitField( const SwField* 
pField )
 {
     assert( dynamic_cast< const SwPostItField* >( pField ));
     const SwPostItField* pPostItField = static_cast<const 
SwPostItField*>(pField);
-    OString aName = OUStringToOString(pPostItField->GetName(), 
RTL_TEXTENCODING_UTF8);
     sal_Int32 nId = 0;
-    std::map< OString, sal_Int32 >::iterator it = 
m_rOpenedAnnotationMarksIds.find(aName);
+    auto it = m_rOpenedAnnotationMarksIds.find(pPostItField->GetName());
     if (it != m_rOpenedAnnotationMarksIds.end())
         // If the postit field has an annotation mark associated, we already 
have an id.
         nId = it->second;
@@ -8050,8 +7984,8 @@ void DocxAttributeOutput::WritePostitFieldReference()
 
         // In case this file is inside annotation marks, we want to write the
         // comment reference after the annotation mark is closed, not here.
-        OString idname = 
OUStringToOString(m_postitFields[m_postitFieldsMaxId].first->GetName(), 
RTL_TEXTENCODING_UTF8);
-        std::map< OString, sal_Int32 >::iterator it = 
m_rOpenedAnnotationMarksIds.find( idname );
+        const OUString& idname = 
m_postitFields[m_postitFieldsMaxId].first->GetName();
+        auto it = m_rOpenedAnnotationMarksIds.find( idname );
         if ( it == m_rOpenedAnnotationMarksIds.end(  ) )
             m_pSerializer->singleElementNS(XML_w, XML_commentReference, 
FSNS(XML_w, XML_id), idstr);
         ++m_postitFieldsMaxId;
@@ -8083,7 +8017,6 @@ DocxAttributeOutput::hasProperties 
DocxAttributeOutput::WritePostitFields()
     }
     for (auto& [f, data] : m_postitFields)
     {
-        OString idstr = OString::number(data.id);
         const DateTime aDateTime = f->GetDateTime();
         bool bNoDate = bRemovePersonalInfo ||
             ( aDateTime.GetYear() == 1970 && aDateTime.GetMonth() == 1 && 
aDateTime.GetDay() == 1 );
@@ -8091,7 +8024,7 @@ DocxAttributeOutput::hasProperties 
DocxAttributeOutput::WritePostitFields()
         rtl::Reference<sax_fastparser::FastAttributeList> pAttributeList
             = sax_fastparser::FastSerializerHelper::createAttrList();
 
-        pAttributeList->add(FSNS( XML_w, XML_id ), idstr);
+        pAttributeList->add(FSNS( XML_w, XML_id ), OString::number(data.id));
         pAttributeList->add(FSNS( XML_w, XML_author ), bRemovePersonalInfo
                  ? "Author" + OString::number( 
GetExport().GetInfoID(f->GetPar1()) )
                  : f->GetPar1().toUtf8());
@@ -8328,18 +8261,10 @@ void DocxAttributeOutput::WriteFinalBookmarks_Impl( 
std::vector< OUString >& rSt
 void DocxAttributeOutput::WriteAnnotationMarks_Impl( std::vector< OUString >& 
rStarts,
         std::vector< OUString >& rEnds )
 {
-    for ( const auto & rAnnotationName : rStarts )
-    {
-        OString rName = OUStringToOString(rAnnotationName, 
RTL_TEXTENCODING_UTF8 ).getStr( );
-        m_rAnnotationMarksStart.push_back( rName );
-    }
+    m_rAnnotationMarksStart.insert(m_rAnnotationMarksStart.end(), 
rStarts.begin(), rStarts.end());
     rStarts.clear();
 
-    for ( const auto & rAnnotationName : rEnds )
-    {
-        OString rName = OUStringToOString( rAnnotationName, 
RTL_TEXTENCODING_UTF8 ).getStr( );
-        m_rAnnotationMarksEnd.push_back( rName );
-    }
+    m_rAnnotationMarksEnd.insert(m_rAnnotationMarksEnd.end(), rEnds.begin(), 
rEnds.end());
     rEnds.clear();
 }
 
@@ -8536,21 +8461,21 @@ void DocxAttributeOutput::ParaLineSpacing_Impl( short 
nSpace, short nMulti )
 {
     if ( nSpace < 0 )
     {
-        AddToAttrList( m_pParagraphSpacingAttrList, 2,
+        AddToAttrList( m_pParagraphSpacingAttrList,
                 FSNS( XML_w, XML_lineRule ), "exact",
-                FSNS( XML_w, XML_line ), OString::number( -nSpace ).getStr() );
+                FSNS( XML_w, XML_line ), OString::number( -nSpace ) );
     }
     else if( nSpace > 0 && nMulti )
     {
-        AddToAttrList( m_pParagraphSpacingAttrList, 2,
+        AddToAttrList( m_pParagraphSpacingAttrList,
                 FSNS( XML_w, XML_lineRule ), "auto",
-                FSNS( XML_w, XML_line ), OString::number( nSpace ).getStr() );
+                FSNS( XML_w, XML_line ), OString::number( nSpace ) );
     }
     else
     {
-        AddToAttrList( m_pParagraphSpacingAttrList, 2,
+        AddToAttrList( m_pParagraphSpacingAttrList,
                 FSNS( XML_w, XML_lineRule ), "atLeast",
-                FSNS( XML_w, XML_line ), OString::number( nSpace ).getStr() );
+                FSNS( XML_w, XML_line ), OString::number( nSpace ) );
     }
 }
 
@@ -8639,18 +8564,18 @@ static void impl_WriteTabElement( FSHelperPtr const & 
pSerializer,
     switch (rTab.GetAdjustment())
     {
     case SvxTabAdjust::Right:
-        pTabElementAttrList->add( FSNS( XML_w, XML_val ), OString( "right" ) );
+        pTabElementAttrList->add( FSNS( XML_w, XML_val ), "right" );
         break;
     case SvxTabAdjust::Decimal:
-        pTabElementAttrList->add( FSNS( XML_w, XML_val ), OString( "decimal" ) 
);
+        pTabElementAttrList->add( FSNS( XML_w, XML_val ), "decimal" );
         break;
     case SvxTabAdjust::Center:
-        pTabElementAttrList->add( FSNS( XML_w, XML_val ), OString( "center" ) 
);
+        pTabElementAttrList->add( FSNS( XML_w, XML_val ), "center" );
         break;
     case SvxTabAdjust::Default:
     case SvxTabAdjust::Left:
     default:
-        pTabElementAttrList->add( FSNS( XML_w, XML_val ), OString( "left" ) );
+        pTabElementAttrList->add( FSNS( XML_w, XML_val ), "left" );
         break;
     }
 
@@ -8663,15 +8588,15 @@ static void impl_WriteTabElement( FSHelperPtr const & 
pSerializer,
     sal_Unicode cFillChar = rTab.GetFill();
 
     if ('.' == cFillChar )
-        pTabElementAttrList->add( FSNS( XML_w, XML_leader ), OString( "dot" ) 
);
+        pTabElementAttrList->add( FSNS( XML_w, XML_leader ), "dot" );
     else if ( '-' == cFillChar )
-        pTabElementAttrList->add( FSNS( XML_w, XML_leader ), OString( "hyphen" 
) );
+        pTabElementAttrList->add( FSNS( XML_w, XML_leader ), "hyphen" );
     else if ( u'\x00B7' == cFillChar ) // middle dot
-        pTabElementAttrList->add( FSNS( XML_w, XML_leader ), OString( 
"middleDot" ) );
+        pTabElementAttrList->add( FSNS( XML_w, XML_leader ), "middleDot" );
     else if ( '_' == cFillChar )
-        pTabElementAttrList->add( FSNS( XML_w, XML_leader ), OString( 
"underscore" ) );
+        pTabElementAttrList->add( FSNS( XML_w, XML_leader ), "underscore" );
     else
-        pTabElementAttrList->add( FSNS( XML_w, XML_leader ), OString( "none" ) 
);
+        pTabElementAttrList->add( FSNS( XML_w, XML_leader ), "none" );
 
     pSerializer->singleElementNS(XML_w, XML_tab, pTabElementAttrList);
 }
@@ -8837,16 +8762,16 @@ void DocxAttributeOutput::FormatFrameSize( const 
SwFormatFrameSize& rSize )
     {
         if ( rSize.GetWidth() && rSize.GetWidthSizeType() == 
SwFrameSize::Fixed )
             AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(),
-                    FSNS( XML_w, XML_w ), OString::number( rSize.GetWidth( ) 
).getStr() );
+                    FSNS( XML_w, XML_w ), OString::number( rSize.GetWidth( ) ) 
);
 
         if ( rSize.GetHeight() )
         {
-            OString sRule( "exact" );
+            std::string_view sRule( "exact" );
             if ( rSize.GetHeightSizeType() == SwFrameSize::Minimum )
-                sRule = OString( "atLeast" );
-            AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), 2,
-                    FSNS( XML_w, XML_hRule ), sRule.getStr(),
-                    FSNS( XML_w, XML_h ), OString::number( rSize.GetHeight( ) 
).getStr() );
+                sRule = "atLeast";
+            AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(),
+                    FSNS( XML_w, XML_hRule ), sRule,
+                    FSNS( XML_w, XML_h ), OString::number( rSize.GetHeight( ) 
) );
         }
     }
     else if ( m_rExport.m_bOutPageDescs )
@@ -8872,13 +8797,13 @@ void 
DocxAttributeOutput::FormatFirstLineIndent(SvxFirstLineIndentItem const& rF
     sal_Int32 const nFirstLineAdjustment(rFirstLine.GetTextFirstLineOffset());
     if (nFirstLineAdjustment > 0)
     {
-        AddToAttrList(m_pLRSpaceAttrList, 1, FSNS(XML_w, XML_firstLine),
-                OString::number(nFirstLineAdjustment).getStr());
+        AddToAttrList(m_pLRSpaceAttrList, FSNS(XML_w, XML_firstLine),
+                OString::number(nFirstLineAdjustment));
     }
     else
     {
-        AddToAttrList(m_pLRSpaceAttrList, 1, FSNS(XML_w, XML_hanging),
-                OString::number(- nFirstLineAdjustment).getStr());
+        AddToAttrList(m_pLRSpaceAttrList, FSNS(XML_w, XML_hanging),
+                OString::number(- nFirstLineAdjustment));
     }
 }
 
@@ -8906,9 +8831,9 @@ void 
DocxAttributeOutput::FormatTextLeftMargin(SvxTextLeftMarginItem const& rTex
         }
     }
     bool const bEcma1st(m_rExport.GetFilter().getVersion() == 
oox::core::ECMA_376_1ST_EDITION);
-    AddToAttrList(m_pLRSpaceAttrList, 1,
+    AddToAttrList(m_pLRSpaceAttrList,
         FSNS(XML_w, (bEcma1st ? XML_left : XML_start)),
-        OString::number(pTextLeftMargin->GetTextLeft()).getStr());
+        OString::number(pTextLeftMargin->GetTextLeft()));
 }
 
 void DocxAttributeOutput::FormatRightMargin(SvxRightMarginItem const& 
rRightMargin)
@@ -8919,9 +8844,9 @@ void 
DocxAttributeOutput::FormatRightMargin(SvxRightMarginItem const& rRightMarg
 #endif
     {
         bool const bEcma1st(m_rExport.GetFilter().getVersion() == 
oox::core::ECMA_376_1ST_EDITION);
-        AddToAttrList(m_pLRSpaceAttrList, 1,
+        AddToAttrList(m_pLRSpaceAttrList,
             FSNS(XML_w, (bEcma1st ? XML_right : XML_end)),
-            OString::number(rRightMargin.GetRight()).getStr());
+            OString::number(rRightMargin.GetRight()));
     }
 }
 
@@ -8940,7 +8865,7 @@ void DocxAttributeOutput::FormatLRSpace( const 
SvxLRSpaceItem& rLRSpace )
     {
         AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( XML_w, 
XML_hSpace ),
                 OString::number(
-                    ( rLRSpace.GetLeft() + rLRSpace.GetRight() ) / 2 
).getStr() );
+                    ( rLRSpace.GetLeft() + rLRSpace.GetRight() ) / 2 ) );
     }
     else if ( m_rExport.m_bOutPageDescs )
     {
@@ -8958,10 +8883,10 @@ void DocxAttributeOutput::FormatLRSpace( const 
SvxLRSpaceItem& rLRSpace )
         m_pageMargins.nRight += 
sal::static_int_cast<sal_uInt16>(rLRSpace.GetRight());
         sal_uInt16 nGutter = rLRSpace.GetGutterMargin();
 
-        AddToAttrList( m_pSectionSpacingAttrList, 3,
-                FSNS( XML_w, XML_left ), OString::number( m_pageMargins.nLeft 
).getStr(),
-                FSNS( XML_w, XML_right ), OString::number( 
m_pageMargins.nRight ).getStr(),
-                FSNS( XML_w, XML_gutter ), OString::number( nGutter ).getStr() 
);
+        AddToAttrList( m_pSectionSpacingAttrList,
+                FSNS( XML_w, XML_left ), OString::number( m_pageMargins.nLeft 
),
+                FSNS( XML_w, XML_right ), OString::number( 
m_pageMargins.nRight ),
+                FSNS( XML_w, XML_gutter ), OString::number( nGutter ) );
     }
     else
     {
@@ -9002,7 +8927,7 @@ void DocxAttributeOutput::FormatULSpace( const 
SvxULSpaceItem& rULSpace )
     {
         AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( XML_w, 
XML_vSpace ),
                 OString::number(
-                    ( rULSpace.GetLower() + rULSpace.GetUpper() ) / 2 
).getStr() );
+                    ( rULSpace.GetLower() + rULSpace.GetUpper() ) / 2 ) );
     }
     else if (m_rExport.m_bOutPageDescs )
     {
@@ -9048,11 +8973,11 @@ void DocxAttributeOutput::FormatULSpace( const 
SvxULSpaceItem& rULSpace )
         // Page Bottom
         m_pageMargins.nBottom = aDistances.m_DyaBottom;
 
-        AddToAttrList( m_pSectionSpacingAttrList, 4,
-                FSNS( XML_w, XML_header ), OString::number( nHeader ).getStr(),
-                FSNS( XML_w, XML_top ), OString::number( m_pageMargins.nTop 
).getStr(),
-                FSNS( XML_w, XML_footer ), OString::number( nFooter ).getStr(),
-                FSNS( XML_w, XML_bottom ), OString::number( 
m_pageMargins.nBottom ).getStr() );
+        AddToAttrList( m_pSectionSpacingAttrList,
+                FSNS( XML_w, XML_header ), OString::number( nHeader ),
+                FSNS( XML_w, XML_top ), OString::number( m_pageMargins.nTop ),
+                FSNS( XML_w, XML_footer ), OString::number( nFooter ),
+                FSNS( XML_w, XML_bottom ), OString::number( 
m_pageMargins.nBottom ) );
     }
     else
     {
@@ -9067,14 +8992,13 @@ void DocxAttributeOutput::FormatULSpace( const 
SvxULSpaceItem& rULSpace )
         else if (m_bParaBeforeAutoSpacing && m_nParaBeforeSpacing == -1)
         {
             AddToAttrList( m_pParagraphSpacingAttrList,
-                    FSNS( XML_w, XML_beforeAutospacing ), "0" );
-            AddToAttrList( m_pParagraphSpacingAttrList,
-                    FSNS( XML_w, XML_before ), OString::number( 
rULSpace.GetUpper() ).getStr() );
+                    FSNS( XML_w, XML_beforeAutospacing ), "0",
+                    FSNS( XML_w, XML_before ), OString::number( 
rULSpace.GetUpper() ) );
         }
         else
         {
             AddToAttrList( m_pParagraphSpacingAttrList,
-                    FSNS( XML_w, XML_before ), OString::number( 
rULSpace.GetUpper() ).getStr() );
+                    FSNS( XML_w, XML_before ), OString::number( 
rULSpace.GetUpper() ) );
         }
         m_bParaBeforeAutoSpacing = false;
         // check if after auto spacing was set during import and spacing we 
get from actual object is same
@@ -9087,14 +9011,13 @@ void DocxAttributeOutput::FormatULSpace( const 
SvxULSpaceItem& rULSpace )
         else if (m_bParaAfterAutoSpacing && m_nParaAfterSpacing == -1)
         {
             AddToAttrList( m_pParagraphSpacingAttrList,
-                    FSNS( XML_w, XML_afterAutospacing ), "0" );
-            AddToAttrList( m_pParagraphSpacingAttrList,
-                                FSNS( XML_w, XML_after ), OString::number( 
rULSpace.GetLower()).getStr() );
+                    FSNS( XML_w, XML_afterAutospacing ), "0",
+                    FSNS( XML_w, XML_after ), OString::number( 
rULSpace.GetLower()) );
         }
         else
         {
             AddToAttrList( m_pParagraphSpacingAttrList,
-                    FSNS( XML_w, XML_after ), OString::number( 
rULSpace.GetLower()).getStr() );
+                    FSNS( XML_w, XML_after ), OString::number( 
rULSpace.GetLower()) );
         }
         m_bParaAfterAutoSpacing = false;
 
@@ -9119,9 +9042,8 @@ namespace docx {
 
 rtl::Reference<FastAttributeList> SurroundToVMLWrap(SwFormatSurround const& 
rSurround)
 {
-    rtl::Reference<FastAttributeList> pAttrList;
-    OString sType;
-    OString sSide;
+    std::string_view sType;
+    std::string_view sSide;
     switch (rSurround.GetSurround())
     {
         case css::text::WrapTextMode_NONE:
@@ -9148,18 +9070,11 @@ rtl::Reference<FastAttributeList> 
SurroundToVMLWrap(SwFormatSurround const& rSur
             sType = "none";
             break;
     }
-    if (!sType.isEmpty() || !sSide.isEmpty())
-    {
-        pAttrList = FastSerializerHelper::createAttrList();
-        if (!sType.isEmpty())
-        {
-            pAttrList->add(XML_type, sType);
-        }
-        if (!sSide.isEmpty())
-        {
-            pAttrList->add(XML_side, sSide);
-        }
-    }
+    rtl::Reference<FastAttributeList> pAttrList;
+    if (!sType.empty())
+        DocxAttributeOutput::AddToAttrList(pAttrList, XML_type, sType);
+    if (!sSide.empty())
+        DocxAttributeOutput::AddToAttrList(pAttrList, XML_side, sSide);
     return pAttrList;
 }
 
@@ -9180,7 +9095,7 @@ void DocxAttributeOutput::FormatSurround( const 
SwFormatSurround& rSurround )
     }
     else if ( m_rExport.m_bOutFlyFrameAttrs )
     {
-        const char* sWrap;
+        std::string_view sWrap;
         switch ( rSurround.GetSurround( ) )
         {
             case css::text::WrapTextMode_NONE:
@@ -9219,11 +9134,11 @@ void DocxAttributeOutput::FormatVertOrientation( const 
SwFormatVertOrient& rFlyV
     else if ( m_rExport.m_bOutFlyFrameAttrs )
     {
         if ( !sAlign.isEmpty() )
-            AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( 
XML_w, XML_yAlign ), sAlign.getStr() );
+            AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( 
XML_w, XML_yAlign ), sAlign );
         else
             AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( 
XML_w, XML_y ),
-                OString::number( rFlyVert.GetPos() ).getStr() );
-        AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( XML_w, 
XML_vAnchor ), sVAnchor.getStr() );
+                OString::number( rFlyVert.GetPos() ) );
+        AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( XML_w, 
XML_vAnchor ), sVAnchor );
     }
 }
 
@@ -9245,11 +9160,11 @@ void DocxAttributeOutput::FormatHorizOrientation( const 
SwFormatHoriOrient& rFly
     else if ( m_rExport.m_bOutFlyFrameAttrs )
     {
         if ( !sAlign.isEmpty() )
-            AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( 
XML_w, XML_xAlign ), sAlign.getStr() );
+            AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( 
XML_w, XML_xAlign ), sAlign );
         else
             AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( 
XML_w, XML_x ),
-                OString::number( rFlyHori.GetPos() ).getStr() );
-        AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( XML_w, 
XML_hAnchor ), sHAnchor.getStr() );
+                OString::number( rFlyHori.GetPos() ) );
+        AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), FSNS( XML_w, 
XML_hAnchor ), sHAnchor );
     }
 }
 
@@ -9288,13 +9203,11 @@ void DocxAttributeOutput::FormatBackground( const 
SvxBrushItem& rBrush )
             // Calculate opacity value
             // Consider oox/source/vml/vmlformatting.cxx : decodeColor() 
function.
             double fOpacity = static_cast<double>(*oAlpha) * 65535 / 
::oox::drawingml::MAX_PERCENT;
-            OString sOpacity = OString::number(fOpacity) + "f";
 
-            AddToAttrList( m_rExport.SdrExporter().getFlyFillAttrList(), 
XML_opacity, sOpacity.getStr() );
+            AddToAttrList( m_rExport.SdrExporter().getFlyFillAttrList(), 
XML_opacity, OString::number(fOpacity) + "f" );
         }
 
-        sColor = "#" + sColor;
-        AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), 
XML_fillcolor, sColor.getStr() );
+        AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), 
XML_fillcolor, "#" + sColor );
     }
     else if (m_rExport.SdrExporter().getDMLTextFrameSyntax())
     {
@@ -9376,7 +9289,7 @@ void DocxAttributeOutput::FormatFillGradient( const 
XFillGradientItem& rFillGrad
         nReverseAngle = (270 - nReverseAngle) % 360;
         if (nReverseAngle != 0)
             AddToAttrList( m_rExport.SdrExporter().getFlyFillAttrList(),
-                    XML_angle, OString::number( nReverseAngle ).getStr() );
+                    XML_angle, OString::number( nReverseAngle ) );
 
         OString sColor1 = sStartColor;
         OString sColor2 = sEndColor;
@@ -9399,10 +9312,8 @@ void DocxAttributeOutput::FormatFillGradient( const 
XFillGradientItem& rFillGrad
                 break;
         }
 
-        sColor1 = "#" + sColor1;
-        sColor2 = "#" + sColor2;
-        AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), 
XML_fillcolor, sColor1.getStr() );
-        AddToAttrList( m_rExport.SdrExporter().getFlyFillAttrList(), 
XML_color2, sColor2.getStr() );
+        AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), 
XML_fillcolor, "#" + sColor1 );
+        AddToAttrList( m_rExport.SdrExporter().getFlyFillAttrList(), 
XML_color2, "#" + sColor2 );
     }
     else if (m_oFillStyle && *m_oFillStyle == drawing::FillStyle_GRADIENT && 
m_rExport.SdrExporter().getDMLTextFrameSyntax())
     {
@@ -9465,7 +9376,7 @@ void DocxAttributeOutput::FormatBox( const SvxBoxItem& 
rBox )
             {
                 if (m_rExport.SdrExporter().getTextFrameSyntax())
                 {
-                    AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), 2,
+                    AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(),
                             XML_stroked, "f", XML_strokeweight, "0pt" );
                 }
             }
@@ -9476,12 +9387,10 @@ void DocxAttributeOutput::FormatBox( const SvxBoxItem& 
rBox )
 
                 if (m_rExport.SdrExporter().getTextFrameSyntax())
                 {
-                    sColor = "#" + sColor;
                     sal_Int32 nWidth = sal_Int32(fConverted / 20);
-                    OString sWidth = OString::number(nWidth) + "pt";
-                    AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), 2,
-                            XML_strokecolor, sColor.getStr(),
-                            XML_strokeweight, sWidth.getStr() );
+                    AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(),
+                            XML_strokecolor, "#" + sColor,
+                            XML_strokeweight, OString::number(nWidth) + "pt" );
                     if( SvxBorderLineStyle::DASHED == 
pTop->GetBorderLineStyle() ) // Line Style is Dash type
                         AddToAttrList( 
m_rExport.SdrExporter().getDashLineStyle(),
                             XML_dashstyle, "dash" );
@@ -9530,7 +9439,7 @@ void DocxAttributeOutput::FormatBox( const SvxBoxItem& 
rBox )
             aInset.insert(0, Concat2View(OString::number(fDistanceLeftInch) + 
"in"));
 
         if (!aInset.isEmpty())
-            m_rExport.SdrExporter().getTextboxAttrList()->add(XML_inset, 
aInset.makeStringAndClear());
+            m_rExport.SdrExporter().getTextboxAttrList()->add(XML_inset, 
aInset);
 
         return;
     }
@@ -9578,15 +9487,13 @@ void DocxAttributeOutput::FormatColumns_Impl( 
sal_uInt16 nCols, const SwFormatCo
     // Get the columns attributes
     rtl::Reference<FastAttributeList> pColsAttrList = 
FastSerializerHelper::createAttrList();
 
-    pColsAttrList->add( FSNS( XML_w, XML_num ),
-            OString::number( nCols ). getStr( ) );
+    pColsAttrList->add( FSNS( XML_w, XML_num ), OString::number( nCols ) );
 
-    const char* pEquals = "false";
+    std::string_view pEquals = "false";
     if ( bEven )
     {
         sal_uInt16 nWidth = rCol.GetGutterWidth( true );
-        pColsAttrList->add( FSNS( XML_w, XML_space ),
-               OString::number( nWidth ).getStr( ) );
+        pColsAttrList->add( FSNS( XML_w, XML_space ), OString::number( nWidth 
) );
 
         pEquals = "true";
     }
@@ -9608,14 +9515,12 @@ void DocxAttributeOutput::FormatColumns_Impl( 
sal_uInt16 nCols, const SwFormatCo
         {
             rtl::Reference<FastAttributeList> pColAttrList = 
FastSerializerHelper::createAttrList();
             sal_uInt16 nWidth = rCol.CalcPrtColWidth( n, 
o3tl::narrowing<sal_uInt16>(nPageSize) );
-            pColAttrList->add( FSNS( XML_w, XML_w ),
-                    OString::number( nWidth ).getStr( ) );
+            pColAttrList->add( FSNS( XML_w, XML_w ), OString::number( nWidth ) 
);
 
             if ( n + 1 != nCols )
             {
                 sal_uInt16 nSpacing = rColumns[n].GetRight( ) + rColumns[n + 
1].GetLeft( );
-                pColAttrList->add( FSNS( XML_w, XML_space ),
-                    OString::number( nSpacing ).getStr( ) );
+                pColAttrList->add( FSNS( XML_w, XML_space ), OString::number( 
nSpacing ) );
             }
 
             m_pSerializer->singleElementNS( XML_w, XML_col, pColAttrList );
@@ -9635,31 +9540,31 @@ void DocxAttributeOutput::FormatTextGrid( const 
SwTextGridItem& rGrid )
 {
     rtl::Reference<FastAttributeList> pGridAttrList = 
FastSerializerHelper::createAttrList();
 
-    OString sGridType;
+    std::string_view sGridType;
     switch ( rGrid.GetGridType( ) )
     {
         default:
         case GRID_NONE:
-            sGridType = OString( "default" );
+            sGridType = "default";
             break;
         case GRID_LINES_ONLY:
-            sGridType = OString( "lines" );
+            sGridType = "lines";
             break;
         case GRID_LINES_CHARS:
             if ( rGrid.IsSnapToChars( ) )
-                sGridType = OString( "snapToChars" );
+                sGridType = "snapToChars";
             else
-                sGridType = OString( "linesAndChars" );
+                sGridType = "linesAndChars";
             break;
     }
     pGridAttrList->add(FSNS(XML_w, XML_type), sGridType);
 
     sal_uInt16 nHeight = rGrid.GetBaseHeight() + rGrid.GetRubyHeight();
     pGridAttrList->add( FSNS( XML_w, XML_linePitch ),
-            OString::number( nHeight ).getStr( ) );
+            OString::number( nHeight ) );
 
     pGridAttrList->add( FSNS( XML_w, XML_charSpace ),
-            OString::number( GridCharacterPitch( rGrid ) ).getStr( ) );
+            OString::number( GridCharacterPitch( rGrid ) ) );
 
     m_pSerializer->singleElementNS( XML_w, XML_docGrid, pGridAttrList );
 }
@@ -9748,29 +9653,29 @@ void DocxAttributeOutput::ParaGrabBag(const 
SfxGrabBagItem& rItem)
 
             for (const auto& rProp : std::as_const(aGrabBagSeq))
             {
-                OString sVal = OUStringToOString(rProp.Value.get<OUString>(), 
RTL_TEXTENCODING_UTF8);
+                OUString sVal = rProp.Value.get<OUString>();
 
                 if (sVal.isEmpty())
                     continue;
 
                 if (rProp.Name == "val")
-                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, XML_val), 
sVal.getStr());
+                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, XML_val), 
sVal);
                 else if (rProp.Name == "color")
-                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_color), sVal.getStr());
+                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_color), sVal);
                 else if (rProp.Name == "themeColor")
-                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_themeColor), sVal.getStr());
+                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_themeColor), sVal);
                 else if (rProp.Name == "themeTint")
-                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_themeTint), sVal.getStr());
+                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_themeTint), sVal);
                 else if (rProp.Name == "themeShade")
-                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_themeShade), sVal.getStr());
+                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_themeShade), sVal);
                 else if (rProp.Name == "fill")
-                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_fill), sVal.getStr());
+                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_fill), sVal);
                 else if (rProp.Name == "themeFill")
-                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_themeFill), sVal.getStr());
+                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_themeFill), sVal);
                 else if (rProp.Name == "themeFillTint")
-                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_themeFillTint), sVal.getStr());
+                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_themeFillTint), sVal);
                 else if (rProp.Name == "themeFillShade")
-                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_themeFillShade), sVal.getStr());
+                    AddToAttrList(m_pBackgroundAttrList, FSNS(XML_w, 
XML_themeFillShade), sVal);
                 else if (rProp.Name == "originalColor")
                     rProp.Value >>= m_sOriginalBackgroundColor;
             }
@@ -9844,46 +9749,39 @@ void DocxAttributeOutput::CharGrabBag( const 
SfxGrabBagItem& rItem )
         if ( rGrabBagElement.first == "CharThemeNameAscii" && bWriteAsciiTheme 
)
         {
             rGrabBagElement.second >>= str;
-            AddToAttrList( m_pFontsAttrList, FSNS( XML_w, XML_asciiTheme ),
-                    OUStringToOString( str, RTL_TEXTENCODING_UTF8 ).getStr() );
+            AddToAttrList( m_pFontsAttrList, FSNS( XML_w, XML_asciiTheme ), 
str );
         }
         else if ( rGrabBagElement.first == "CharThemeNameCs" && bWriteCSTheme )
         {
             rGrabBagElement.second >>= str;
-            AddToAttrList( m_pFontsAttrList, FSNS( XML_w, XML_cstheme ),
-                    OUStringToOString( str, RTL_TEXTENCODING_UTF8 ).getStr() );
+            AddToAttrList( m_pFontsAttrList, FSNS( XML_w, XML_cstheme ), str );
         }
         else if ( rGrabBagElement.first == "CharThemeNameEastAsia" && 
bWriteEastAsiaTheme )
         {
             rGrabBagElement.second >>= str;
-            AddToAttrList( m_pFontsAttrList, FSNS( XML_w, XML_eastAsiaTheme ),
-                    OUStringToOString( str, RTL_TEXTENCODING_UTF8 ).getStr() );
+            AddToAttrList( m_pFontsAttrList, FSNS( XML_w, XML_eastAsiaTheme ), 
str );
         }
         else if ( rGrabBagElement.first == "CharThemeNameHAnsi" && 
bWriteAsciiTheme )
         // this is not a mistake: in LibO we don't directly support the hAnsi 
family
         // of attributes so we save the same value from ascii attributes 
instead
         {
             rGrabBagElement.second >>= str;
-            AddToAttrList( m_pFontsAttrList, FSNS( XML_w, XML_hAnsiTheme ),
-                    OUStringToOString( str, RTL_TEXTENCODING_UTF8 ).getStr() );
+            AddToAttrList( m_pFontsAttrList, FSNS( XML_w, XML_hAnsiTheme ), 
str );
         }
         else if ( rGrabBagElement.first == "CharThemeColor" && 
bWriteThemeFontColor )
         {
             rGrabBagElement.second >>= str;
-            AddToAttrList( m_pColorAttrList, FSNS( XML_w, XML_themeColor ),
-                    OUStringToOString( str, RTL_TEXTENCODING_UTF8 ).getStr() );
+            AddToAttrList( m_pColorAttrList, FSNS( XML_w, XML_themeColor ), 
str );
         }
         else if ( rGrabBagElement.first == "CharThemeColorShade" )
         {
             rGrabBagElement.second >>= str;
-            AddToAttrList( m_pColorAttrList, FSNS( XML_w, XML_themeShade ),
-                    OUStringToOString( str, RTL_TEXTENCODING_UTF8 ).getStr() );
+            AddToAttrList( m_pColorAttrList, FSNS( XML_w, XML_themeShade ), 
str );
         }
         else if ( rGrabBagElement.first == "CharThemeColorTint" )
         {
             rGrabBagElement.second >>= str;
-            AddToAttrList( m_pColorAttrList, FSNS( XML_w, XML_themeTint ),
-                    OUStringToOString( str, RTL_TEXTENCODING_UTF8 ).getStr() );
+            AddToAttrList( m_pColorAttrList, FSNS( XML_w, XML_themeTint ), str 
);
         }
         else if( rGrabBagElement.first == "CharThemeFontNameCs"   ||
                 rGrabBagElement.first == "CharThemeFontNameAscii" ||
@@ -10013,18 +9911,17 @@ void DocxAttributeOutput::BulletDefinition(int nId, 
const Graphic& rGraphic, Siz
     m_pSerializer->startElementNS(XML_w, XML_numPicBullet,
             FSNS(XML_w, XML_numPicBulletId), OString::number(nId));
 
-    OStringBuffer aStyle;
     // Size is in twips, we need it in points.
-    aStyle.append("width:" + OString::number(double(aSize.Width()) / 20));
-    aStyle.append("pt;height:" + OString::number(double(aSize.Height()) / 20) 
+ "pt");
+    OString aStyle = "width:" + OString::number(double(aSize.Width()) / 20)+ 
"pt;"
+                     "height:" + OString::number(double(aSize.Height()) / 20) 
+ "pt";
     m_pSerializer->startElementNS(XML_w, XML_pict);
     m_pSerializer->startElementNS( XML_v, XML_shape,
-            XML_style, aStyle.getStr(),
+            XML_style, aStyle,
             FSNS(XML_o, XML_bullet), "t");
 
     OUString aRelId = m_rDrawingML.WriteImage(rGraphic);
     m_pSerializer->singleElementNS( XML_v, XML_imagedata,
-            FSNS(XML_r, XML_id), OUStringToOString(aRelId, 
RTL_TEXTENCODING_UTF8),
+            FSNS(XML_r, XML_id), aRelId,
             FSNS(XML_o, XML_title), "");
 
     m_pSerializer->endElementNS(XML_v, XML_shape);
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx 
b/sw/source/filter/ww8/docxattributeoutput.hxx
index 16d2ebc65029..1d44240be9e5 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -453,7 +453,7 @@ private:
     void PostponeOLE( SwOLENode& rNode, const Size& rSize, const 
SwFlyFrameFormat* pFlyFrameFormat );
     void WriteOLE( SwOLENode& rNode, const Size& rSize, const 
SwFlyFrameFormat* rFlyFrameFormat );
     void WriteOLEShape(const SwFlyFrameFormat& rFrameFormat, const Size& rSize,
-                       const OString& rShapeId, const OUString& rImageId);
+                       std::string_view rShapeId, const OUString& rImageId);
     static OString GetOLEStyle(const SwFlyFrameFormat& rFormat, const Size& 
rSize);
     void ExportOLESurround(const SwFormatSurround& rWrap);
 
@@ -741,7 +741,7 @@ private:
 
     void DoWriteBookmarkTagStart(std::u16string_view bookmarkName);
     void DoWriteBookmarkTagEnd(sal_Int32 nId);
-    void DoWriteMoveRangeTagStart(const OString & bookmarkName,
+    void DoWriteMoveRangeTagStart(std::u16string_view bookmarkName,
             bool bFrom, const SwRedlineData* pRedlineData);
     void DoWriteMoveRangeTagEnd(sal_Int32 nId, bool bFrom);
     void DoWriteBookmarksStart(std::vector<OUString>& rStarts, const 
SwRedlineData* pRedlineData = nullptr);
@@ -768,7 +768,7 @@ private:
 
     void WriteFormDateStart(const OUString& sFullDate, const OUString& 
sDateFormat, const OUString& sLang, const uno::Sequence<beans::PropertyValue>& 
aGrabBagSdt);
     void WriteSdtPlainText(const OUString& sValue, const 
uno::Sequence<beans::PropertyValue>& aGrabBagSdt);
-    void WriteSdtDropDownStart(std::u16string_view rName, OUString const& 
rSelected, uno::Sequence<OUString> const& rListItems);
+    void WriteSdtDropDownStart(const OUString& rName, OUString const& 
rSelected, uno::Sequence<OUString> const& rListItems);
     void WriteSdtDropDownEnd(OUString const& rSelected, 
uno::Sequence<OUString> const& rListItems);
     void WriteContentControlStart();
     void WriteContentControlEnd();
@@ -872,27 +872,27 @@ private:
     std::vector<OUString> m_rPermissionsEnd;
 
     /// Annotation marks to output
-    std::vector<OString> m_rAnnotationMarksStart;
-    std::vector<OString> m_rAnnotationMarksEnd;
+    std::vector<OUString> m_rAnnotationMarksStart;
+    std::vector<OUString> m_rAnnotationMarksEnd;
 
     /// Maps of the bookmarks ids
     std::map<OUString, sal_Int32> m_rOpenedBookmarksIds;
 
     /// Name of the last opened bookmark.
-    OString m_sLastOpenedBookmark;
+    OUString m_sLastOpenedBookmark;
 
     /// Set of ids of the saved bookmarks (used only for moveRange, yet)
     std::unordered_set<sal_Int32> m_rSavedBookmarksIds;
 
     /// Maps of the annotation marks ids
-    std::map<OString, sal_Int32> m_rOpenedAnnotationMarksIds;
+    std::map<OUString, sal_Int32> m_rOpenedAnnotationMarksIds;
 
     /// Name of the last opened annotation mark.
-    OString m_sLastOpenedAnnotationMark;
+    OUString m_sLastOpenedAnnotationMark;
 
     /// If there are bookmarks around sequence fields, this map contains the
     /// names of these bookmarks for each sequence.
-    std::map<OUString, std::vector<OString> > m_aSeqBookmarksNames;
+    std::map<OUString, std::vector<OUString> > m_aSeqBookmarksNames;
 
     /// GrabBag for text effects like glow, shadow, ...
     std::vector<css::beans::PropertyValue> m_aTextEffectsGrabBag;
@@ -1111,8 +1111,13 @@ public:
     static OString convertToOOXMLVertOrientRel(sal_Int16 nOrientRel);
     static OString convertToOOXMLHoriOrientRel(sal_Int16 nOrientRel);
     static void ImplCellMargins( sax_fastparser::FSHelperPtr const & 
pSerializer, const SvxBoxItem& rBox, sal_Int32 tag, bool bUseStartEnd, const 
SvxBoxItem* pDefaultMargins = nullptr);
-    static void 
AddToAttrList(rtl::Reference<sax_fastparser::FastAttributeList>& pAttrList, 
sal_Int32 nAttrs, ...);
-    static void 
AddToAttrList(rtl::Reference<sax_fastparser::FastAttributeList>& pAttrList, 
sal_Int32 nAttrName, const char* sAttrValue);
+    template <class... Args>
+    static void 
AddToAttrList(rtl::Reference<sax_fastparser::FastAttributeList>& pAttrList, 
Args&&... args)
+    {
+        if (!pAttrList)
+            pAttrList = sax_fastparser::FastSerializerHelper::createAttrList();
+        pAttrList->add(std::forward<Args>(args)...);
+    }
 
     static const sal_Int32 Tag_StartParagraph_1 = 1;
     static const sal_Int32 Tag_StartParagraph_2 = 2;
diff --git a/sw/source/filter/ww8/docxsdrexport.cxx 
b/sw/source/filter/ww8/docxsdrexport.cxx
index 95f7957db5e1..fa6cd25bbb7e 100644
--- a/sw/source/filter/ww8/docxsdrexport.cxx
+++ b/sw/source/filter/ww8/docxsdrexport.cxx
@@ -853,10 +853,10 @@ void DocxSdrExport::startDMLAnchorInline(const 
SwFrameFormat* pFrameFormat, cons
         }
         attrList->add(XML_behindDoc, bOpaque ? "0" : "1");
 
-        attrList->add(XML_distT, OString::number(TwipsToEMU(nDistT)).getStr());
-        attrList->add(XML_distB, OString::number(TwipsToEMU(nDistB)).getStr());
-        attrList->add(XML_distL, OString::number(TwipsToEMU(nDistL)).getStr());
-        attrList->add(XML_distR, OString::number(TwipsToEMU(nDistR)).getStr());
+        attrList->add(XML_distT, OString::number(TwipsToEMU(nDistT)));
+        attrList->add(XML_distB, OString::number(TwipsToEMU(nDistB)));
+        attrList->add(XML_distL, OString::number(TwipsToEMU(nDistL)));
+        attrList->add(XML_distR, OString::number(TwipsToEMU(nDistR)));
 
         attrList->add(XML_simplePos, "0");
         attrList->add(XML_locked, "0");
@@ -889,8 +889,7 @@ void DocxSdrExport::startDMLAnchorInline(const 
SwFrameFormat* pFrameFormat, cons
         {
             OUString sAnchorId = lclGetAnchorIdFromGrabBag(pObj);
             if (!sAnchorId.isEmpty())
-                attrList->addNS(XML_wp14, XML_anchorId,
-                                OUStringToOString(sAnchorId, 
RTL_TEXTENCODING_UTF8));
+                attrList->addNS(XML_wp14, XML_anchorId, sAnchorId);
         }
 
         m_pImpl->getSerializer()->startElementNS(XML_wp, XML_anchor, attrList);
@@ -1097,16 +1096,15 @@ void DocxSdrExport::startDMLAnchorInline(const 
SwFrameFormat* pFrameFormat, cons
         // nDist is forced to zero above and ignored by Word anyway, so write 
0 directly.
         rtl::Reference<sax_fastparser::FastAttributeList> aAttrList
             = sax_fastparser::FastSerializerHelper::createAttrList();
-        aAttrList->add(XML_distT, OString::number(0).getStr());
-        aAttrList->add(XML_distB, OString::number(0).getStr());
-        aAttrList->add(XML_distL, OString::number(0).getStr());
-        aAttrList->add(XML_distR, OString::number(0).getStr());
+        aAttrList->add(XML_distT, OString::number(0));
+        aAttrList->add(XML_distB, OString::number(0));
+        aAttrList->add(XML_distL, OString::number(0));
+        aAttrList->add(XML_distR, OString::number(0));
         if (pObj)
         {
             OUString sAnchorId = lclGetAnchorIdFromGrabBag(pObj);
             if (!sAnchorId.isEmpty())
-                aAttrList->addNS(XML_wp14, XML_anchorId,
-                                 OUStringToOString(sAnchorId, 
RTL_TEXTENCODING_UTF8));
+                aAttrList->addNS(XML_wp14, XML_anchorId, sAnchorId);
         }
         m_pImpl->getSerializer()->startElementNS(XML_wp, XML_inline, 
aAttrList);
     }
@@ -1392,18 +1390,16 @@ void DocxSdrExport::writeDMLDrawing(const SdrObject* 
pSdrObject, const SwFrameFo
 
     rtl::Reference<sax_fastparser::FastAttributeList> pDocPrAttrList
         = sax_fastparser::FastSerializerHelper::createAttrList();
-    pDocPrAttrList->add(XML_id, OString::number(nAnchorId).getStr());
-    pDocPrAttrList->add(XML_name, OUStringToOString(pSdrObject->GetName(), 
RTL_TEXTENCODING_UTF8));
+    pDocPrAttrList->add(XML_id, OString::number(nAnchorId));
+    pDocPrAttrList->add(XML_name, pSdrObject->GetName());
     if (!pSdrObject->GetTitle().isEmpty())
-        pDocPrAttrList->add(XML_title,
-                            OUStringToOString(pSdrObject->GetTitle(), 
RTL_TEXTENCODING_UTF8));
+        pDocPrAttrList->add(XML_title, pSdrObject->GetTitle());
     if (!pSdrObject->GetDescription().isEmpty())
-        pDocPrAttrList->add(XML_descr,
-                            OUStringToOString(pSdrObject->GetDescription(), 
RTL_TEXTENCODING_UTF8));
+        pDocPrAttrList->add(XML_descr, pSdrObject->GetDescription());
     if (!pSdrObject->IsVisible()
         && pFrameFormat->GetAnchor().GetAnchorId() != RndStdIds::FLY_AS_CHAR)
 
-        pDocPrAttrList->add(XML_hidden, OString::number(1).getStr());
+        pDocPrAttrList->add(XML_hidden, OString::number(1));
 
     pFS->startElementNS(XML_wp, XML_docPr, pDocPrAttrList);
     OUString sHyperlink = pSdrObject->getHyperlink();
@@ -1796,9 +1792,8 @@ void DocxSdrExport::writeDMLTextFrame(ww8::Frame const* 
pParentFrame, int nAncho
 
         rtl::Reference<sax_fastparser::FastAttributeList> pDocPrAttrList
             = sax_fastparser::FastSerializerHelper::createAttrList();
-        pDocPrAttrList->add(XML_id, OString::number(nAnchorId).getStr());
-        pDocPrAttrList->add(XML_name,
-                            OUStringToOString(rFrameFormat.GetName(), 
RTL_TEXTENCODING_UTF8));
+        pDocPrAttrList->add(XML_id, OString::number(nAnchorId));
+        pDocPrAttrList->add(XML_name, rFrameFormat.GetName());
 
         pFS->startElementNS(XML_wp, XML_docPr, pDocPrAttrList);
 
@@ -2094,8 +2089,7 @@ void DocxSdrExport::writeVMLTextFrame(ww8::Frame const* 
pParentFrame, bool bText
     {
         OUString sAnchorId = lclGetAnchorIdFromGrabBag(pObject);
         if (!sAnchorId.isEmpty())
-            m_pImpl->getFlyAttrList()->addNS(XML_w14, XML_anchorId,
-                                             OUStringToOString(sAnchorId, 
RTL_TEXTENCODING_UTF8));
+            m_pImpl->getFlyAttrList()->addNS(XML_w14, XML_anchorId, sAnchorId);
 
         uno::Reference<drawing::XShape> 
xShape(const_cast<SdrObject*>(pObject)->getUnoShape(),
                                                uno::UNO_QUERY);
@@ -2104,8 +2098,7 @@ void DocxSdrExport::writeVMLTextFrame(ww8::Frame const* 
pParentFrame, bool bText
         if (xShapeProps.is())
             xShapeProps->getPropertyValue("HyperLinkURL") >>= sHyperlink;
         if (!sHyperlink.isEmpty())
-            m_pImpl->getFlyAttrList()->add(XML_href,
-                                           OUStringToOString(sHyperlink, 
RTL_TEXTENCODING_UTF8));
+            m_pImpl->getFlyAttrList()->add(XML_href, sHyperlink);
     }
     rtl::Reference<FastAttributeList> xFlyAttrList(m_pImpl->getFlyAttrList());
     m_pImpl->getFlyAttrList().clear();
diff --git a/sw/source/filter/ww8/docxtableexport.cxx 
b/sw/source/filter/ww8/docxtableexport.cxx
index 2ac6e2db0597..5915caa2a9ab 100644
--- a/sw/source/filter/ww8/docxtableexport.cxx
+++ b/sw/source/filter/ww8/docxtableexport.cxx
@@ -422,7 +422,6 @@ void DocxAttributeOutput::TableDefinition(
             {
                 m_pSerializer->singleElementNS(XML_w, XML_tblpPr, 
attrListTablePos);
             }
-            attrListTablePos = nullptr;
         }
         else
             SAL_WARN("sw.ww8", "DocxAttributeOutput::TableDefinition: 
unhandled property: "
@@ -586,33 +585,31 @@ void DocxAttributeOutput::TableBackgrounds(
     {
         rtl::Reference<sax_fastparser::FastAttributeList> pAttrList;
 
-        for (const auto& rGrabBagElement : rGrabBag)
+        for (const auto & [ name, val ] : rGrabBag)
         {
-            if (!rGrabBagElement.second.has<OUString>())
+            if (!val.has<OUString>())
                 continue;
 
-            OString sValue
-                = OUStringToOString(rGrabBagElement.second.get<OUString>(), 
RTL_TEXTENCODING_UTF8);
-            if (rGrabBagElement.first == "themeFill")
-                AddToAttrList(pAttrList, FSNS(XML_w, XML_themeFill), 
sValue.getStr());
-            else if (rGrabBagElement.first == "themeFillTint")
-                AddToAttrList(pAttrList, FSNS(XML_w, XML_themeFillTint), 
sValue.getStr());
-            else if (rGrabBagElement.first == "themeFillShade")
-                AddToAttrList(pAttrList, FSNS(XML_w, XML_themeFillShade), 
sValue.getStr());
-            else if (rGrabBagElement.first == "fill")
-                AddToAttrList(pAttrList, FSNS(XML_w, XML_fill), 
sValue.getStr());
-            else if (rGrabBagElement.first == "themeColor")
-                AddToAttrList(pAttrList, FSNS(XML_w, XML_themeColor), 
sValue.getStr());
-            else if (rGrabBagElement.first == "themeTint")
-                AddToAttrList(pAttrList, FSNS(XML_w, XML_themeTint), 
sValue.getStr());
-            else if (rGrabBagElement.first == "themeShade")
-                AddToAttrList(pAttrList, FSNS(XML_w, XML_themeShade), 
sValue.getStr());
-            else if (rGrabBagElement.first == "color")
-                AddToAttrList(pAttrList, FSNS(XML_w, XML_color), 
sValue.getStr());
-            else if (rGrabBagElement.first == "val")
-                AddToAttrList(pAttrList, FSNS(XML_w, XML_val), 
sValue.getStr());
+            if (name == "themeFill")
+                AddToAttrList(pAttrList, FSNS(XML_w, XML_themeFill), 
val.get<OUString>());
+            else if (name == "themeFillTint")
+                AddToAttrList(pAttrList, FSNS(XML_w, XML_themeFillTint), 
val.get<OUString>());
+            else if (name == "themeFillShade")
+                AddToAttrList(pAttrList, FSNS(XML_w, XML_themeFillShade), 
val.get<OUString>());
+            else if (name == "fill")
+                AddToAttrList(pAttrList, FSNS(XML_w, XML_fill), 
val.get<OUString>());

... etc. - the rest is truncated

Reply via email to