Используя XQUERY (baseX), я хочу получить информацию в некоторых отчетах Jasper. Мне нужно вернуть текст внутри ELEMENT cdata - PullRequest
1 голос
/ 17 января 2020

с помощью блокнота ++ У меня есть путь к элементу, содержащему cdata, который выглядит следующим образом:

/jasperReport[1]/columnHeader[1]/band[1]/staticText[1]/text[1]

источник выглядит примерно так:

<jasperReport>
    <columnHeader>
        <band height="22" >
            <staticText>
                <reportElement x="0" y="0" width="48" height="20" uuid="one"/>
                <box leftPadding="1">
                    <pen lineWidth="0.5"/>
                    <topPen lineWidth="0.5"/>
                    <leftPen lineWidth="0.5"/>
                    <bottomPen lineWidth="0.5"/>
                    <rightPen lineWidth="0.5"/>
                </box>
                <textElement>
                    <font size="8" />
                </textElement>
                <text><![CDATA[MYNUM]]></text>
            </staticText>

Я пытаюсь использовать XQUERY для возврата значений, похожих на «MYNUM», от второй до последней строки во фрагменте xml. В этом случае он скажет мне, что в этой части заголовка есть текст «MYNUM». Я намереваюсь вернуть более полную информацию для многих похожих отчетов, используя XQUERY с BaseX на моей ма c.

Так что я могу запустить xquery для набора файлов отчетов, которые будут выводить что-то вроде:

/ filenameofreport.data

<Header>
<reportElement>x=0 y=0 value=MYNUM</reportElement>
<reportElement>x=10 y=0 value=THATNUM</reportElement>
</HEADER>

хорошо, я знаю этот запрос ввода:

declare namespace abc="http://jasperreports.sourceforge.net/jasperreports";

for $document in collection("temp")
where document-uri($document) = "/temp/Daily_P1NoAssign_.data"
return
 for $thefield in  $document//abc:jasperReport[1]/abc:columnHeader[1]/abc:band[1]/abc:staticText[1]/abc:textElement[1]/abc:font
   let $fontsize := string-join(("<font>",$thefield/@size,"</font>"))
   let $docgroup := xs:string((document-uri($document)))
   group by $docgroup
   order by $docgroup
   return ( element {"jasperReport"} { $docgroup }  , $fontsize)

произвел этот вывод:

<jasperReport>/temp/Daily_P1NoAssign_.data</jasperReport>
<font>8</font>

Итак ... этот ввод нацелен у элемента textElement должен быть правильный элемент, но я не знаю, как вывести данные

xquery:

declare namespace abc="http://jasperreports.sourceforge.net/jasperreports";

for $document in collection("temp")
where document-uri($document) = "/temp/Daily_P1NoAssign_.data"
return
 for $thefield in  $document//abc:jasperReport[1]/abc:columnHeader[1]/abc:band[1]/abc:staticText[1]/abc:text[1]
   let $textinfo := string-join(("<text>",$thefield/*,"</text>"))
   let $docgroup := xs:string((document-uri($document)))
   group by $docgroup
   order by $docgroup
   return ( element {"jasperReport"} { $docgroup }  , $textinfo)

возвращает:

<jasperReport>/temp/Daily_P1NoAssign_.data</jasperReport>
<text></text>

update : О, я почти все понял, я думаю - сначала вот решение, но я хотел бы вывести данные немного по-другому ...

declare namespace abc="http://jasperreports.sourceforge.net/jasperreports";

for $document in collection("temp")
where document-uri($document) = "/temp/Daily_P1NoAssign_.data"
return
 for $thefield in  $document//abc:jasperReport[1]/abc:columnHeader[1]/abc:band[1]/abc:staticText/abc:text[1]
   let $textinfo3 := $thefield/text()
   let $docgroup := xs:string((document-uri($document)))
   group by $docgroup
   order by $docgroup
   return ( element {"jasperReport"} { $docgroup }  ,$textinfo3)

возвращает это с WONUM WORKTPE et c в отдельных строках:

<jasperReport>/temp/Daily_P1NoAssign_.data</jasperReport>
WONUM
WORKTYPE
LOCATION
MODELNUM
SERIALNUM
REPORTDATE
STATUSDATE
STATUS
OWNER
OWNERGROUP
WARRANTYEXPDATE
INWARRANTY

Есть ли способ вернуть это с помощью WONUM WORKTYPE et c в одной строке ??

<jasperReport>/temp/Daily_P1NoAssign_.data</jasperReport>
WONUM WORKTYPE LOCATION MODELNUM SERIALNUM REPORTDATE STATUSDATE STATUS OWNER OWNERGROUP WARRANTYEXPDATE INWARRANTY

1 Ответ

0 голосов
/ 21 января 2020

Самый простой способ устранить символы перевода строки - использовать метод normalize-space().

Либо

let $textinfo3 := normalize-space($thefield/text())

, либо

let $textinfo3 := normalize-space(string-join($thefield/text(), " "))
...