2

サンプルXMLの繰り返しグループを2つの区切られたテキスト行に変換したかったのです。これが私の現在のコードバージョンです:

string orderXml = 
@"<?xml version='1.0' encoding='utf-8'?>
<Order id='79223510'>
<Status>new</Status>
<ShipMethod>Standard International</ShipMethod>
<ToCity>Tokyo</ToCity>
<Items>
    <Item>
    <SKU>SKU-1234567890</SKU>
    <Quantity>1</Quantity>
    <Price>99.95</Price>
    </Item>
    <Item>
    <SKU>SKU-1234567899</SKU>
    <Quantity>1</Quantity>
    <Price>199.95</Price>
    </Item>
</Items>
</Order>";

StringReader str = new StringReader(orderXml);

var xslt = new XmlTextReader(new StringReader(
@"<?xml version='1.0' encoding='UTF-8'?>" +
"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>" +

"<xsl:output method='text' indent='no'/>" +

"<!-- New line character variable -->" +
"<xsl:variable name='newline'>" +
"<xsl:text>&#13;&#10;</xsl:text>" +
"</xsl:variable>" +
"<xsl:variable name='empty'>" +
"<xsl:text></xsl:text>" +
"</xsl:variable>" +

"<xsl:template match='/'>" +         

"<xsl:for-each select='Order'>" +
"<xsl:value-of select='@id'/>|" + 
"<xsl:value-of select='Status'/>|" +
"<xsl:value-of select='ShipMetod'/>|" +
"<xsl:value-of select='ToCity'/>|" + 
"<xsl:value-of select='$newline'/>" +
"</xsl:for-each>" +

"<xsl:for-each select='Order/Items/Item'>" +
"<xsl:value-of select='SKU'/>|" +          
"<xsl:value-of select='Quantity'/>|" +   
"<xsl:value-of select='Price'/>|" +    
"<xsl:value-of select='$newline'/>" +
"</xsl:for-each>" + 

"</xsl:template>" +
"</xsl:stylesheet>"
                ));

var xDoc = new XPathDocument(str);
var xTr = new System.Xml.Xsl.XslCompiledTransform();
xTr.Load(xslt);

StringBuilder sb = new StringBuilder();
StringWriter writer = new StringWriter(sb);
xTr.Transform(xDoc, null, writer);

string[] lines = sb.ToString().Split(new string[] {"\n"}, StringSplitOptions.RemoveEmptyEntries);    

lines.ToList().ForEach(System.Console.Write);     

このコードは現在、次の出力を生成します。

79223510|new||Tokyo|
SKU-1234567890|1|99.95|
SKU-1234567899|1|199.95|

そして私はそれが次のものを作り出すことを望みました:

79223510|new||Tokyo|SKU-1234567890|1|99.95|
79223510|new||Tokyo|SKU-1234567899|1|199.95|

XSL変換を使用するだけです。お知らせ下さい。

PS読みやすくするためにテキスト形式でXSLを追加しました。

@<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method='text' indent='no'/>

<!-- New line character variable -->
<xsl:variable name='newline'>
<xsl:text>&#13;&#10;</xsl:text>
</xsl:variable>
<xsl:variable name='empty'>
<xsl:text></xsl:text>
</xsl:variable>

<xsl:template match='/'>         

<xsl:for-each select='Order'>
<xsl:value-of select='@id'/>| 
<xsl:value-of select='Status'/>|
<xsl:value-of select='ShipMetod'/>|
<xsl:value-of select='ToCity'/>| 
<xsl:value-of select='$newline'/>
</xsl:for-each>

<xsl:for-each select='Order/Items/Item'>
<xsl:value-of select='SKU'/>|          
<xsl:value-of select='Quantity'/>|   
<xsl:value-of select='Price'/>|    
<xsl:value-of select='$newline'/>
</xsl:for-each> 

</xsl:template>
</xsl:stylesheet>
4

1 に答える 1

2

あなたはいくつかの間違いを犯しています:

  1. ループ内のループではなく、2つの別々のfor-eachループを使用しているため、出力の最初の行はOrder要素からのものであり、次の2つはItem要素からのものです。(実際には、ループは必要ありません。以下の解決策。)
  2. スペルShipMetodを間違えたため、フィールドの1つが誤って空白になっています。
  3. |フィールド値に存在する可能性のある値をエスケープする方法はありません。(あなたがそれについて何をしたいのかわからないので、私の解決策はこの問題を解決しません。)

より良い解決策は、テンプレートマッチングと文字列連結を使用することです。

<xsl:stylesheet version="1.0" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method="text" indent="no" media-type="text/plain" />

<xsl:variable name='newline'><xsl:text>&#13;&#10;</xsl:text></xsl:variable>
<xsl:variable name='delimiter'>|</xsl:variable>

<!-- by default, don't copy any nodes to output -->
<xsl:template match="node()|@*"><xsl:apply-templates select="node()|@*"/></xsl:template>

<xsl:template match="/Order/Items/Item"><xsl:value-of
select="concat(
../../@id, $delimiter,
../../Status, $delimiter,
../../ShipMethod, $delimiter,
../../ToCity, $delimiter,
SKU, $delimiter,
Quantity, $delimiter,
Price, $delimiter,
$newline)"/></xsl:template>

</xsl:stylesheet>

これにより、次の出力が生成されます。

79223510|new|Standard International|Tokyo|SKU-1234567890|1|99.95|
79223510|new|Standard International|Tokyo|SKU-1234567890|1|199.95|
于 2012-06-29T21:50:16.277 に答える