Sử dụng XSLT để sắp xếp, trộn ... file XML

Thầy cho em hỏi về yêu cầu của BT4 ở đoạn trộn 2 file: theo cách trộn đa pha, theo cách xml. Mình làm 1 trong 2 cái hay làm hết vậy thầy?
Thêm nữa như bạn trên đã hỏi là những ai đã chấm vấn đáp BT1,2,3 rồi thì thứ 3 tuần sau ở nhà không cần đi nữa hả thầy?

thầy hướng dẫn tụi em trộn 2 file xml theo cách trộn đa pha ??? trộn số như bài 3 thì em hiểu chứ trộn 2 file xml thì em chẳng bít làm sao cả???

Thầy em cho em xin thuật toán của trộn xml và trộn đa pha trên 2 file xml đi thầy. Hay thầy cho em xin 1 bài ví dụ tay nho nhỏ từng bước thực hiện về 2 cái ấy cũng được
Em search google rồi mà cũng không thấy, lên ddth hỏi thử nó là gì thì kết quả cũng không khả quan vì người trả lời giúp chỉ nói chung chung về trộn chứ chẳng có thuật toán hay cách thức gì hết. Cám ơn thầy nhiều lắm!

[QUOTE=08520549;14806]thầy hướng dẫn tụi em trộn 2 file xml theo cách trộn đa pha ??? trộn số như bài 3 thì em hiểu chứ trộn 2 file xml thì em chẳng bít làm sao cả???[/QUOTE]
Bạn xem mỗi node WORD trong file XML như là một số như bài 3. Khi đó bạn so sánh text trong node HEAD với bên kia để chọn phần tử nhỏ hơn.
[QUOTE=09520668;14821]Thầy em cho em xin thuật toán của trộn xml và trộn đa pha trên 2 file xml đi thầy. Hay thầy cho em xin 1 bài ví dụ tay nho nhỏ từng bước thực hiện về 2 cái ấy cũng được
Em search google rồi mà cũng không thấy, lên ddth hỏi thử nó là gì thì kết quả cũng không khả quan vì người trả lời giúp chỉ nói chung chung về trộn chứ chẳng có thuật toán hay cách thức gì hết. Cám ơn thầy nhiều lắm![/QUOTE]
Rất nhiều mà bạn. Xem ở hơn 3 triệu trang trên Google chỉ cách làm này. Do đó Tôi bắt các bạn phải coi XSLT trước khi làm bài.
[QUOTE=09520337;14826]ý em là những người bữa vừa rồi không đi chấm đó thầy. có được chấm vào bữa sau không thầy[/QUOTE]
Bạn nào chưa được chấm thì thứ ba tuần sau đi chấm.

Thưa thầy, về yêu cầu trộn 2 file có thể dùng 1 cách khác là: trộn 2 file với nhau trước theo thứ tự chưa được sắp xếp, sau đó dùng cách sắp xếp theo tag <HEAD> ở yêu cầu trước đó sắp xếp lại file đã trộn được không thầy?

[QUOTE=toannv;14834]Bạn xem mỗi node WORD trong file XML như là một số như bài 3. Khi đó bạn so sánh text trong node HEAD với bên kia để chọn phần tử nhỏ hơn.
[/QUOTE]
Cái này đầu tiên mình sắp xếp = trộn đa pha text của HEAD trên file txt tạm, rồi dùng file txt đã sắp xếp đó tìm từng từ ở 2 file xml cần trộn rồi chép dữ liệu node HEAD có text tìm được vào file xml kết quả cho đến khi nào hết file txt được không thầy? Hay lúc trộn đa pha phải đảo trực tiếp node HEAD trên file xml? Hay còn cách làm nào khác?
[QUOTE=toannv;14834]Rất nhiều mà bạn. Xem ở hơn 3 triệu trang trên Google chỉ cách làm này. Do đó Tôi bắt các bạn phải coi XSLT trước khi làm bài.
[/QUOTE]
Cám ơn thầy nhiều lắm! Tại lúc đầu em không biết là sử dụng xslt cho phần trộn này(em hơi dở anh văn nên search tiếng việt không có), tưởng phải code từ đầu hết àk :smiley:

[QUOTE=08520348;14856]Thưa thầy, về yêu cầu trộn 2 file có thể dùng 1 cách khác là: trộn 2 file với nhau trước theo thứ tự chưa được sắp xếp, sau đó dùng cách sắp xếp theo tag <HEAD> ở yêu cầu trước đó sắp xếp lại file đã trộn được không thầy?[/QUOTE]
[QUOTE=09520668;14872]Cái này đầu tiên mình sắp xếp = trộn đa pha text của HEAD trên file txt tạm, rồi dùng file txt đã sắp xếp đó tìm từng từ ở 2 file xml cần trộn rồi chép dữ liệu node HEAD có text tìm được vào file xml kết quả cho đến khi nào hết file txt được không thầy? Hay lúc trộn đa pha phải đảo trực tiếp node HEAD trên file xml? Hay còn cách làm nào khác?
[/QUOTE]
Nói chung với cách sort “bằng tay” (không dùng XSLT) thì các bạn làm kiểu gì cũng được. Giáo viên sẽ hỏi cơ chế của việc sắp xếp bằng XSLT :):):slight_smile:

[QUOTE=toannv;14895]Nói chung với cách sort “bằng tay” (không dùng XSLT) thì các bạn làm kiểu gì cũng được. Giáo viên sẽ hỏi cơ chế của việc sắp xếp bằng XSLT :):):)[/QUOTE]
Phần Trộn Đa Pha có thể dùng XSLT làm được luôn hả thầy??? hay dùng code bài 3 trộn đa pha (và làm theo ý em nói ở trên)?

[QUOTE=toannv;14895]Nói chung với cách sort “bằng tay” (không dùng XSLT) thì các bạn làm kiểu gì cũng được. Giáo viên sẽ hỏi cơ chế của việc sắp xếp bằng XSLT :):):)[/QUOTE]
Thầy ơi, em không dùng XSLT để trộn mà trộn bằng DataSet được không thầy?

[QUOTE=09520668;14903]Phần Trộn Đa Pha có thể dùng XSLT làm được luôn hả thầy??? hay dùng code bài 3 trộn đa pha (và làm theo ý em nói ở trên)?[/QUOTE]
Cái này Tôi chưa rõ câu hỏi của bạn.

[QUOTE=09520548;14907]Thầy ơi, em không dùng XSLT để trộn mà trộn bằng DataSet được không thầy?[/QUOTE]
Được nhưng GV sẽ hỏi lý do vì sao như thế?

Thưa thầy cho em hỏi về yêu cầu sắp xếp theo tag <HEAD> thứ tự ABC là mình dùng xslt hay là dùng thuật toán so sánh sắp xếp bằng tay vậy thầy?

Thành dùng xsl, tìm hiểu sort là làm được ak, " <xsl:sort select=“HEAD” data-type=“text”/> ", nhớ ghi đường dẫn tới nút HEAD nữa là ok.

[QUOTE=08520480;15177]Thành dùng xsl, tìm hiểu sort là làm được ak, " <xsl:sort select=“HEAD” data-type=“text”/> ", nhớ ghi đường dẫn tới nút HEAD nữa là ok.[/QUOTE]
Thật ra thì mình làm theo 2 cách luôn là sort bằng thuật toán riêng của mình và sort theo xslt. Với xslt thì nó ngắn gọn và chạy nhanh hơn chút nhưng mà kết quả hiện thị lại không hoàn toàn chính xác, vì khâu xử lý phân cấp lồng nhiều tag POS và BODY chèn nhau sẽ không hiện thị được như mong muốn, sẽ bị gom nhóm lại với nhau. Với cách kia thì hiện thị kết quả chính xác tuyệt đối, nên quyết định chọn cách sort thủ công luôn. :smiley:

thầy cho em hỏi ???
đầu tiên mình có 2 file XML
để trộn 2 file XML dùng XSLT
đầu tiên mình tạo 1 file XSLT để nó thực hiện việc trộn
vậy sau đó trong C# sẽ gọi xslt để nó thực hiện việc trộn và ghi ra file mới như thế nào???
mong thầy hướng dẫn phần trộn này kĩ hơn??? tại có 2 file XML đầu vào nên em ko biết xử lý sao??? mà ko chạy được nên em củn hok chỉnh sửa và biết được file XSLT nó thực hiện cụ thể việc trộn như thế nào để chỉnh sửa

[QUOTE=08520549;15316]thầy cho em hỏi ???
đầu tiên mình có 2 file XML
để trộn 2 file XML dùng XSLT
đầu tiên mình tạo 1 file XSLT để nó thực hiện việc trộn
vậy sau đó trong C# sẽ gọi xslt để nó thực hiện việc trộn và ghi ra file mới như thế nào???
mong thầy hướng dẫn phần trộn này kĩ hơn??? tại có 2 file XML đầu vào nên em ko biết xử lý sao??? mà ko chạy được nên em củn hok chỉnh sửa và biết được file XSLT nó thực hiện cụ thể việc trộn như thế nào để chỉnh sửa[/QUOTE]

Tôi có gởi link tham khảo rồi mà ở topic trước rồi mà. Ví dụ như ở http://stackoverflow.com/questions/4402102/xml-merge-two-files-using-xsl

thầy cho em hỏi??
phần trộn 2 file XML bằng XSLT
sau khi tạo ra file XSL để thực hiện việc trộn 2 file đó
thì trong C# sẽ gọi và thực hiện như thế nào ah??? vì có 2 đầu vào nên em không hiểu mong thầy giải thích

Sử dụng class() XslCompiledTransform và phương thức Transform.Bạn cứ tìm hiểu đi nếu không hiểu thì pm cho Vũ.

bạn có thẻ gửi đoạn code demo đó lên không!!!1

Cách sử dụng XslCompiledTransform như sau* (từ bài làm của khóa trước)*

private void mergeUsingXSLT()
{
XslCompiledTransform transformer = new XslCompiledTransform();
XsltSettings settings = new XsltSettings(true, false);
transformer.Load("XSL\\Merger.xslt", settings, new XmlUrlResolver());
transformer.Transform("XMLDict1.xml", "XMLDictionaryMerged.xml");
}

Do đó quan trọng là bạn viết file XSLT (từ bài làm của khóa trước)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<xsl:template match="/">
<xsl:element name="DICTIONARY">
<xsl:apply-templates />
<xsl:call-template name="CopyRemainingItems" />
</xsl:element>
</xsl:template>
<xsl:param name="with" select="'../XMLDict2.xml'" />
<xsl:template match="WORD">
<xsl:element name="WORD">
<xsl:call-template name="NewLine" />
<xsl:apply-templates select="HEAD" />
<xsl:call-template name="NewLine" />
<xsl:apply-templates select="POS" />
<xsl:apply-templates select="BODY" />
<xsl:variable name="wordDefs" select="document($with)/DICTIONARY/WORD[HEAD=current()/HEAD]/." />
<xsl:for-each select="$wordDefs/*">
<xsl:if test="name() != 'HEAD'">
<xsl:apply-templates select="POS" />
<xsl:apply-templates select="BODY" />
</xsl:if>
</xsl:for-each>
</xsl:element>
</xsl:template>
<xsl:template match="HEAD" >
<xsl:element name="HEAD">
<xsl:value-of select="." />
</xsl:element>
</xsl:template>
<xsl:template match="POS" >
<xsl:element name="POS">
<xsl:value-of select="." />
</xsl:element>
<xsl:call-template name="NewLine" />
</xsl:template>
<xsl:template match="BODY">
<xsl:element name="BODY">
<xsl:call-template name="NewLine" />
<xsl:call-template name="Tab" />
<xsl:apply-templates select="TXT_V" />
<xsl:call-template name="NewLine" />
</xsl:element>
<xsl:call-template name="NewLine" />
</xsl:template>
<xsl:template match="TXT_V">
<xsl:element name="TXT_V">
<xsl:value-of select="." />
</xsl:element>
</xsl:template>
<xsl:template name="NewLine">
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template name="Tab">
<xsl:text>	</xsl:text>
</xsl:template>
<xsl:template name="CopyRemainingItems">
<xsl:variable name="secondNodeList" select="document($with)/DICTIONARY/WORD" />
<xsl:for-each select="$secondNodeList">
<xsl:variable name="duplicateSet" select="DICTIONARY/WORD[HEAD=current()/HEAD]" />
<xsl:if test="count(duplicateSet) = 0">
<xsl:element name="WORD">
<xsl:call-template name="NewLine" />
<xsl:apply-templates select="HEAD" />
<xsl:call-template name="NewLine" />
<xsl:apply-templates select="POS" />
<xsl:apply-templates select="BODY" />
</xsl:element>
<xsl:call-template name="NewLine" />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Ngoài ra, nếu không dùng XSLT thì bạn có thể sử dụng các cách sau: