sw/qa/extras/ooxmlexport/data/tdf148111.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport17.cxx   |   28 +++++++++++++++++++++++++++
 writerfilter/source/dmapper/SdtHelper.cxx    |    3 +-
 3 files changed, 30 insertions(+), 1 deletion(-)

New commits:
commit 9d033508af5257aeebbd8c22a053db5e74a814d3
Author:     Vasily Melenchuk <vasily.melenc...@cib.de>
AuthorDate: Fri Mar 25 11:14:10 2022 +0300
Commit:     Thorsten Behrens <thorsten.behr...@allotropia.de>
CommitDate: Sat Mar 26 23:02:01 2022 +0100

    tdf#148111: docx std fields: use placeholder text for empty data
    
    It is quite unexpected Word behavior: if data source for sdt field
    exists but contains empty string it is not used. Placeholder is
    inserted instead.
    
    In general behavior is more complex: logic of replacement is defined
    by <w:showingPlcHdr> property and results can vary (see testcase).
    But LO does not support this property correctly yet.
    
    Change-Id: I2ec8efe05f79a01af5d74d21bfcd05f3b19e3970
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132096
    Tested-by: Jenkins
    Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf148111.docx 
b/sw/qa/extras/ooxmlexport/data/tdf148111.docx
new file mode 100644
index 000000000000..a46fb508dc0e
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148111.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
index aff5fb3b336c..8162b8fbb414 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
@@ -319,6 +319,34 @@ DECLARE_OOXMLEXPORT_TEST(testTdf146851_2, 
"tdf146851_2.docx")
     CPPUNIT_ASSERT_EQUAL(OUString("Schedule"), 
xTextField->getPresentation(false));
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf148111, "tdf148111.docx")
+{
+    uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<container::XEnumerationAccess> 
xFieldsAccess(xTextFieldsSupplier->getTextFields());
+
+    uno::Reference<container::XEnumeration> 
xFields(xFieldsAccess->createEnumeration());
+    std::vector<OUString> aExpectedValues = {
+        // These field values are NOT in order in document: getTextFields did 
provide
+        // fields in a strange but fixed order
+        "Title", "Placeholder", "Placeholder", "Placeholder",
+        "Placeholder", "Placeholder", "Placeholder", "Placeholder",
+        "Placeholder", "Placeholder", "Placeholder", "Placeholder",
+        "Placeholder", "Placeholder", "Placeholder", "Placeholder",
+        "Placeholder", "Title", "Title", "Title",
+        "Title", "Title", "Title", "Title"
+    };
+
+    sal_uInt16 nIndex = 0;
+    while (xFields->hasMoreElements())
+    {
+        uno::Reference<text::XTextField> xTextField(xFields->nextElement(), 
uno::UNO_QUERY);
+        CPPUNIT_ASSERT_EQUAL(aExpectedValues[nIndex++], 
xTextField->getPresentation(false));
+    }
+
+    // No more fields
+    CPPUNIT_ASSERT(!xFields->hasMoreElements());
+}
+
 DECLARE_OOXMLEXPORT_TEST(testTdf81507, "tdf81507.docx")
 {
     xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml");
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx 
b/writerfilter/source/dmapper/SdtHelper.cxx
index f4fa3ef69405..f05d1c68b049 100644
--- a/writerfilter/source/dmapper/SdtHelper.cxx
+++ b/writerfilter/source/dmapper/SdtHelper.cxx
@@ -195,7 +195,8 @@ std::optional<OUString> SdtHelper::getValueFromDataBinding()
     {
         uno::Reference<XXPathObject> xResult = xXpathAPI->eval(xDocument, 
m_sDataBindingXPath);
 
-        if (xResult.is() && xResult->getNodeList() && 
xResult->getNodeList()->getLength())
+        if (xResult.is() && xResult->getNodeList() && 
xResult->getNodeList()->getLength()
+            && xResult->getString().getLength())
         {
             return xResult->getString();
         }

Reply via email to