2016-05-25 12 views
0
(ネストされたタグを持つ)XSLを使用して

... ...私はXMLのようなものを持っている

私はそれがSolrので受け入れることができるように、次の形式に変換したい
<?xml version='1.0' encoding='utf-8'?> 
<HL7Message> 
    <MSH> 
     <MSH.1>|</MSH.1> 
     <MSH.2>^~\&amp;</MSH.2> 
     <MSH.3> 
      <MSH.3.1>ST01</MSH.3.1> 
     </MSH.3> 
     <MSH.4> 
      <MSH.4.1>A</MSH.4.1> 
     </MSH.4> 
     <MSH.5> 
      <MSH.5.1>HC</MSH.5.1> 
      <MSH.5.2>HC2</MSH.5.2> 
     </MSH.5> 
    </MSH> 
</HL7Message> 

をXMLを

変換

<add> 
<doc> 
    <field name="MSH.1">|</field> 
    <field name="MSH.2">^~\&amp;</field> 
    <field name="MSH.3.1">ST01</field> 
    <field name="MSH.4.1">A</field> 
    <field name="MSH.5.1">HC</field> 
    <field name="MSH.5.2">HC2</field> 
</doc> 
</add> 

今、私は

<?xml version='1.0' encoding='utf-8'?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" encoding="utf-8" indent="yes"/> 
<xsl:strip-space elements="*" /> 
<xsl:template match="MSH"> 
<add><doc> 
<xsl:apply-templates select="MSH"/> 
<xsl:for-each select="*"> 
<xsl:element name="field"> 

<xsl:attribute name="name"><xsl:value-of select="node()"/</xsl:attribute> 
<xsl:value-of select="."/> 
</xsl:element> 

</xsl:for-each> 
</doc></add> 
</xsl:template> 
</xsl:stylesheet> 

...以下のように1つのXSLTを作成しましたが、それは今の形式を以下に変換します。..

<add> 
<doc> 
    <field name="MSH.1">|</field> 
    <field name="MSH.2">^~\&amp;</field> 
    <field name="MSH.3">ST01</field> 
    <field name="MSH.4">A</field> 
    ***<field name="MSH.5">HCHC2</field>*** 
</doc> 
</add> 

我々は

誰が助けるか、私は間違いを犯しています私を導くことができるならば、それは非常に高く評価されるだろう。.. MSH 5.1とMSH 5.2は、私が期待してい以外である組み合わせなっている見ることができるように.. 前もって感謝します。

答えて

1

MSH要素の直接的な子要素を選択する代わりに、子要素自体を持たない子孫要素を選択することをお勧めします。

<xsl:for-each select=".//*[not(*)]"> 

だから、これはMSH.5.1例えばMSH.5.2ではなくMSH.5自体を選択します。

が、これは完璧です

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

<xsl:template match="MSH"> 
    <add> 
    <doc> 
    <xsl:for-each select=".//*[not(*)]"> 
     <field name="{name()}"> 
     <xsl:value-of select="."/> 
     </field> 
    </xsl:for-each> 
    </doc> 
    </add> 
</xsl:template> 
</xsl:stylesheet> 
+0

(私も@name属性を作成する属性値テンプレートを簡略化している)、このXSLTを試してみてください。私は本当に助けに感謝します。 – Prashant

関連する問題