1

XSLT または C# を使用して移動することは可能ですか?

<XML>
  <Name>Name1;Name2</Name> 
  <Adress>Adress1;Adress2</Adress>
</XML>

これに

<XML>
    <LINE>
        <Name>Name1</Name> 
        <Adress>Adress1</Adress> 
    </LINE>
    <LINE>
        <Name>Name2</Name> 
        <Adress>Adress2</Adress> 
   </LINE>
</XML>

どんな助けでも大歓迎です。

4

3 に答える 3

1

この XSLT 2.0 変換:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <xsl:copy>
    <xsl:variable name="vTop" select="."/>
    <xsl:variable name="vAddresses" select="tokenize(Adress, ';')"/>

    <xsl:for-each select="tokenize(Name, ';')">
     <xsl:variable name="vPos" select="position()" as="xs:integer"/>
     <xsl:apply-templates select="$vTop/Name">
       <xsl:with-param name="pNameData" select="."/>
       <xsl:with-param name="pAdrData" select="$vAddresses[$vPos]"/>
     </xsl:apply-templates>
    </xsl:for-each>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="Name">
  <xsl:param name="pNameData"/>
  <xsl:param name="pAdrData"/>

  <Line>
   <Name><xsl:value-of select="$pNameData"/></Name>
   <Adress><xsl:value-of select="$pAdrData"/></Adress>
  </Line>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<XML>
    <Name>Name1;Name2</Name>
    <Adress>Adress1;Adress2</Adress>
</XML>

必要な正しい結果が生成されます。

<XML>
   <Line>
      <Name>Name1</Name>
      <Adress>Adress1</Adress>
   </Line>
   <Line>
      <Name>Name2</Name>
      <Adress>Adress2</Adress>
   </Line>
</XML>
于 2013-02-18T02:54:46.907 に答える
1

これは非常に単純な XSLT 1.0 ソリューションです。

入力ファイル:

<XML>
  <Name>Name1;Name2</Name> 
  <Address>Address1;Address2</Address>
  <Name>Name3;Name4</Name> 
  <Address>Address3;Address4</Address>
</XML>

スタイルシート:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="XML">
    <XML>
      <xsl:apply-templates select="Name"/>
    </XML>
  </xsl:template>

  <xsl:template match="Name" mode="name-address">
    <xsl:param name="name" select="substring-before(., ';')"/>
    <xsl:param name="address" select="substring-before(following-sibling::*[1][self::Address], ';')"/>

    <LINE>
      <Name>
        <xsl:value-of select="$name"/>
      </Name>
      <Address>
        <xsl:value-of select="$address"/>
      </Address>
    </LINE>
  </xsl:template>

  <xsl:template match="Name">
    <xsl:apply-templates select="." mode="name-address"/>
    <xsl:apply-templates select="." mode="name-address">
      <xsl:with-param name="name" select="substring-after(., ';')"/>
      <xsl:with-param name="address" select="substring-after(following-sibling::*[1][self::Address], ';')"/>
    </xsl:apply-templates>
  </xsl:template>

</xsl:stylesheet>

出力:

<?xml version="1.0" encoding="UTF-8"?>
<XML>
   <LINE>
      <Name>Name1</Name>
      <Address>Address1</Address>
   </LINE>
   <LINE>
      <Name>Name2</Name>
      <Address>Address2</Address>
   </LINE>
   <LINE>
      <Name>Name3</Name>
      <Address>Address3</Address>
   </LINE>
   <LINE>
      <Name>Name4</Name>
      <Address>Address4</Address>
   </LINE>
</XML>
于 2013-02-17T19:31:02.623 に答える
0

XSLTについてはわかりませんが、可能であれば、おそらく非常に複雑なソリューションがあります。

ただし、C#ではかなり簡単です。これを行う1つの方法は次のとおりです(LINQ to XMLを使用):

var inputXml = 
    @"<XML>
        <Name>Name1;Name2</Name> 
        <Adress>Adress1;Adress2</Adress>
    </XML>";

var inputXmlDoc = XDocument.Parse(inputXml);

var names = inputXmlDoc.Root.Descendants("Name").Single().Value.Split(';');
var addresses = inputXmlDoc.Root.Descendants("Adress").Single().Value.Split(';');

var outputXmlDoc = new XDocument(
    new XElement("XML",
        names.Zip(addresses, (n, a) => new {n, a})
            .Select(pair => new XElement("LINE",
                    new XElement("Name", pair.n),
                    new XElement("Address", pair.a)
            ))
        )
    );

Console.WriteLine(outputXmlDoc);
于 2013-02-17T19:18:04.387 に答える