XQuery

2011-10-06 20 views
7

में XML आउटपुट के लिए इंडेंटेशन को दबाने के लिए कैसे करें XML आउटपुट के इंडेंटेशन को हटाने के लिए XQuery के भीतर से कोई तरीका है?XQuery

ईजी। कहो मेरे पास XQuery था;

<foo><bar/></foo> 

का एक XML परिणाम दस्तावेज़ उत्पादन;

<foo> 
    <bar/> 
</foo> 

मैं इंडेंट को कैसे हटा सकता हूं ताकि आउटपुट दस्तावेज़ इस तरह दिखाई दे;

<foo> 
<bar/> 
</foo> 

आदर्श रूप से मुझे कुछ ऐसा चाहिए जो मैं स्वयं XQuery के साथ नियंत्रित कर सकूं। क्वेरी की शुरुआत में घोषणाओं में। मैंने XQuery में इस तरह की चीजों को डालने की कोशिश की है;

declare namespace saxon="http://saxon.sf.net/"; 
declare option saxon:output "indent=no"; 

और ऊपर दिए गए कई अन्य बदलाव Google के द्वारा किए गए दस्तावेज़ों के आधार पर, लेकिन एक्सएमएल आउटपुट कभी नहीं बदलता है।

मैं सैक्सन का उपयोग कर रहा हूं और जावा एक्सक्यूजे एक्सटेंशन के माध्यम से इसे कॉल कर रहा हूं;

import net.sf.saxon.xqj.SaxonXQDataSource; 

क्या जावा में ऐसा नहीं है जो मुझे Xquery में नहीं करना है?

अद्यतन

इस कोड मैं सैक्सन कॉल करने के लिए उपयोग कर रहा हूँ है। मुझे खेद है कि इसमें बहुत कुछ है लेकिन मुझे यकीन नहीं है कि प्रासंगिक क्या होगा;

private String runXQuery(String query, HttpServletRequest request, String payload) 
throws XQException { 

    XQDataSource ds = new SaxonXQDataSource(); 
    XQConnection conn = ds.getConnection(); 

    XQPreparedExpression exp = conn.prepareExpression(query); 

    bindObject(exp, "HTTP_METHOD", request.getMethod()); 
    bindObject(exp, "HTTP_URI", request.getRequestURI()); 
    bindObject(exp, "HTTP_QUERY", request.getQueryString()); 
    bindObject(exp, "HTTP_COOKIES", request.getHeader("Cookie")); 
    bindObject(exp, "HTTP_PAYLOAD", payload); 

    XQResultSequence result = exp.executeQuery();   // Run the XQuery. 

    StringBuffer buffer = new StringBuffer(); 

    while (result.next()) { 
    buffer.append(result.getItemAsString(null)); 
    buffer.append(System.getProperty("line.separator")); 
    } 

    return buffer.toString(); 

} 

के ऊपर इस प्रकार कहा जाता है;

public void handle(String target, Request baseRequest, HttpServletRequest request, 
HttpServletResponse response) throws IOException, ServletException { 

    response.setContentType("text/html;charset=utf-8"); 
    baseRequest.setHandled(true); 

    File file = null; 
    String out = ""; 

    File inbound = new File(root, target);  // File or folder 
    file = checkFile(inbound);     // File. 
    String xquery = loadFile(file); 
    String payload = getPayload(request.getReader()); 
    out = runXQuery(xquery, request, payload); 
    response.setStatus(HttpServletResponse.SC_OK); 
    response.getWriter().println(out); 

} 

जहाँ तक मुझे पता है, मैं तो बस outputting हूँ जो कुछ सादे पाठ के रूप executeQuery() से वापस आता है।

प्रोग्राम XQuery सर्वर के प्रकार के रूप में काम करता है। यह किसी विशिष्ट XQuery फ़ाइल के लिए HTTP क्लाइंट से अनुरोध के लिए एक विशिष्ट पोर्ट पर सुनता है। फिर वह उस फ़ाइल को लोड करता है और इसे सैक्सन को चलाने के लिए पास करता है, फिर सैक्सन से HTTP क्लाइंट को परिणाम आउटपुट करता है।

+1

ऐसा करने का एक लंगड़ा तरीका है। बस अपने खुद के लेखक में respond.getWriter() को लपेटें जो लक्षित लेखक को लिखते समय \ t छोड़ देता है। हां, मुझे पता है कि यह सही तरीका नहीं है - लेकिन यह quickfix – SirVaulterScoff

उत्तर

0

यह स्पष्ट नहीं है कि यहां क्या गलत है। लेकिन आपने समझाया नहीं है कि आप आउटपुट कैसे उत्पन्न कर रहे हैं। एक्सक्यूजे में आप वास्तव में क्वेरी कैसे चला रहे हैं, और आप इसका आउटपुट कहां भेज रहे हैं? (आपके द्वारा दी गई जानकारी से, हो सकता है कि सीरियलाइजेशन क्वेरी प्रोसेसर द्वारा भी नहीं किया जा रहा है - उदाहरण के लिए आप एक डोम को आउटपुट लिख रहे हैं और फिर डीओएम को क्रमबद्ध कर सकते हैं।)

+0

मैंने सैक्सन को कॉल करने वाले कोड को जोड़कर प्रश्न अपडेट किया है। जहां तक ​​मुझे पता है, मैं केवल क्वेरी परिणाम को सादे पाठ के रूप में देख रहा हूं और इसे एक टेक्स्ट स्ट्रीम में लिख रहा हूं जो एक HTTP प्रतिक्रिया के रूप में ब्राउज़र में वापस आ जाता है। –

0

अतिरिक्त गुंथर statet, आप भी XQuery Prolog में इस विकल्प को परिभाषित करने के लिए संभावना मिल गया है:

declare namespace saxon = "http://saxon.sf.net/"; 
declare option saxon:output "indent=no"; 

आप सेक्सन के लिए बाध्य नहीं कर रहे हैं, BaseXindents -option (सेक्सन के indent-spaces के समान) स्थापित करने के लिए संभावना प्रदान करता है और मुफ़्त है।

declare option output:indent "yes"; 
declare option output:indents "0"; 
0

आप विकल्प सेक्सन की घोषणा की कोशिश कर सकते:

तुम बस निम्नांकित दो पंक्तियों का उपयोग करने की आवश्यकता होगी उत्पादन "विधि = पाठ"; या आप विकल्प सैक्सन घोषित करने का प्रयास कर सकते हैं: आउटपुट "विधि = एक्सएमएल";

यदि वे काम नहीं करते हैं, तो आप विशेष पात्रों को पट्टी कर सकते हैं और आउटपुट करने से पहले उन्हें ट्रिम कर सकते हैं। चीयर्स!

1
इसके बजाय

buffer.append(result.getItemAsString(null)); 

में null गुजर के रूप में getItemAsString के लिए दस्तावेज़, जो "no" के लिए एक indent कुंजी सेट के रूप में XSLT 2.0 and XQuery 1.0 Serialization reference में दस्तावेज शामिल द्वारा सुझाए गए आप, एक गुण वस्तु पास करना चाहिए की

असल में, यह XQuery निष्पादन समस्या नहीं है, लेकिन एक प्रश्न है कि XQuery का परिणाम वास्तव में किसी भी स्वरूपण के बिना नोड सेट कैसे है स्ट्रिंग या StringBuffer में परिवर्तित किया गया है जिसमें स्वरूपण होता है।

संबंधित मुद्दे