1

次の XML があります。XML には「item」要素が複数回出現し、「info」要素は 1 回出現します。

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

<root xmlns="http://temo.com/tempe.xsd">


<di>    
<md>2013-07-09T09:43:00</md>
</di>


<list>

<item>
<Name>test</Name>
<section block1="true">
<block1>
<move>1</move>
<info>
<item1>test item 1</item1>
<item2>false</item2>
<item3>1</item3>
</info>
</block1>
<block2>
...
</block2>
</section>
</item>
</list>

<option>
...
</option>

</root>

そして、それを以下の形式に変換したい、つまり、「move」要素が存在する場合、「info」要素の最後の位置に新しい要素を追加して作成する必要があります

<item4>
 <item5>1</item5>
</item4>


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

<root xmlns="http://temo.com/tempe.xsd">


<di>    
<md>2013-07-09T09:43:00</md>
</di>


<list>

<item>
<Name>test</Name>
<section block1="true">
<block1>
<move>1</move>
<info>
  <item1>test item 1</item1>
  <item2>false</item2>
  <item3>1</item3>
  <item4>
    <item5>1</item5>
  </item4>
</info>
</block1>
  <block2>
    ...
  </block2>
</section>
</item>
<item>
    ...
</item>
</list>
<option>
...
</option>

</root>

上記の形式に変換するために、次の XSLT を使用しています

<?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="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="/info/*[position()=last()]">
<xsl:copy>
<xsl:choose>
<xsl:when test="/section/block/move">
<!--Add new element item4-->
<xsl:element name="item4">
<xsl:element name="item5">
<xsl:value-of select="section/block/move"/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="identity" />
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

XSLT の問題を見つけるのを手伝ってくれませんか? XSLT は初めてです

ありがとうございました :)

4

1 に答える 1

0

入力XMLにデフォルトの名前空間宣言があり、出力XMLにも要素を挿入するためにその名前空間が必要なので、

xmlns:tp="http://temo.com/tempe.xsd"

ルート要素で、xsl:stylesheetそのプレフィックスを使用するようにパスとパターンを調整する必要があります。たとえば、info必要な代わりに、必要な代わりtp:infoになどです。section/block/movetp:section/tp:block/tp:move

XSLT サンプルのパスは間違っているように見えます/section/block/moveが、名前空間プレフィックスを追加しても、ルート要素は何も選択されませんroot/sectionそしてあなたのパスはblock、入力はblock1です。

コードを修正しようとする代わりに、新しいスタイルシートを書きました。

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://temo.com/tempe.xsd"
  xmlns:tp="http://temo.com/tempe.xsd"
  exclude-result-prefixes="tp"
  version="1.0">

<xsl:param name="to-insert" xml:space="preserve">
<item4>
 <item5><xsl:value-of select="//tp:section/tp:block1/tp:move"/></item5>
</item4>
</xsl:param>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="tp:item[.//tp:move[. = 1]]//tp:info">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
    <xsl:copy-of select="$to-insert"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

出力します

<root xmlns="http://temo.com/tempe.xsd">


<di>
<md>2013-07-09T09:43:00</md>
</di>


<list>

<item>
<Name>test</Name>
<section block1="true">
<block1>
<move>1</move>
<info>
<item1>test item 1</item1>
<item2>false</item2>
<item3>1</item3>

<item4 xmlns:tp="http://temo.com/tempe.xsd">
 <item5>1</item5>
</item4>
</info>
</block1>
<block2>
...
</block2>
</section>
</item>
</list>

<option>
...
</option>

</root>
于 2013-07-24T16:04:53.010 に答える