1

次の XML フラグメントがあります。

<svrl:successful-report test="."
location="/*[local-name()='ClinicalDocument']/*[local-name()='component']/*[local-name()='structuredBody']/*[local-name()='component'][1]/*[local-name()='section']">

値を取得して@location、特殊文字" *[local-name()=' "" '] ". つまり、出力を

/ClinicalDocument/component/structuredBody/component[1]/section

私は現在、この文字列置換テンプレートを使用しています:

<xsl:template name="string-replace-all">
<xsl:param name="text" />
<xsl:param name="replace" />
<xsl:param name="by" />
<xsl:choose>
  <xsl:when test="contains($text, $replace)">
    <xsl:value-of select="substring-before($text,$replace)" />
    <xsl:value-of select="$by" />
    <xsl:call-template name="string-replace-all">
      <xsl:with-param name="text"
      select="substring-after($text,$replace)" />
      <xsl:with-param name="replace" select="$replace" />
      <xsl:with-param name="by" select="$by" />
    </xsl:call-template>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="$text" />
  </xsl:otherwise>
</xsl:choose>
</xsl:template>

そして、このようなテンプレートを適用します

                <xsl:call-template name="string-replace-all">
                <xsl:with-param name="text" select="@location"/>
                 <xsl:with-param name="replace" select="'[local-name()='"/>
                 <xsl:with-param name="by" select="''"/>         
            </xsl:call-template>    

それはこの結果を与えるだけです:

/*'ClinicalDocument']/*'component']/*'structuredBody']/*'component'][1]/*'section']

必要な出力を取得するにはどうすればよいですか?

4

2 に答える 2

0

この質問に対するもう 1 つの回答は良いものですが、次のようなソース XML ドキュメントには問題があります

<test xmlns:svrl="my:my">
 <svrl:successful-report test="." location=
 "/*[local-name()='ClinicalDocument']/*[local-name()='component'][.='abc']"/>
</test>

このドキュメントに適用した場合の結果は次のとおりです。

   /ClinicalDocument/component[.='abc

しかし、正しい結果は次のとおりです。

 /ClinicalDocument/component[.='abc']

この変換は、上記の XML ドキュメントでは問題ありません

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

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

 <xsl:template match="@location">
  <xsl:attribute name="location">
    <xsl:call-template name="makeExplicit">
     <xsl:with-param name="pText" select="substring(.,2)"/>
    </xsl:call-template>
  </xsl:attribute>
 </xsl:template>

 <xsl:template name="makeExplicit">
  <xsl:param name="pText" select="."/>
  <xsl:if test="$pText">
   <xsl:variable name="vStep" select="substring-before(concat($pText, '/'), '/')"/>
   <xsl:call-template name="processStep">
     <xsl:with-param name="pStep" select="$vStep"/>
   </xsl:call-template>
   <xsl:call-template name="makeExplicit">
     <xsl:with-param name="pText" select="substring-after($pText, '/')"/>
   </xsl:call-template>
  </xsl:if>
 </xsl:template>

 <xsl:template name="processStep">
  <xsl:param name="pStep"/>
  <xsl:text>/</xsl:text>
  <xsl:value-of select="substring-before(concat($pStep, '*['), '*[')"/>

  <xsl:variable name="vPred" select="substring-after($pStep, '*[local-name()=')"/>
  <xsl:value-of select="substring-before(substring($vPred, 2), &quot;'&quot;)"/>
  <xsl:value-of select="substring-after($vPred, ']')"/>
 </xsl:template>
</xsl:stylesheet>

上記のドキュメントに適用すると、正しい、必要な結果が生成されます。

<test xmlns:svrl="my:my">
   <svrl:successful-report test="." 
      location="/ClinicalDocument/component[.='abc']"/>
</test>
于 2012-04-28T14:40:24.247 に答える
0

ここで 2 つの「検索と置換」を行う必要があります。最初にすべての接頭辞*[local-name()='を削除する必要があり、次に']の接尾辞を削除する必要があります

これを行うには、最初のcall-templateの結果をパラメーターとして 2 番目のcall-templateに渡します。

ここに完全な XSLT があります

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:svrl="my:my">
   <xsl:template match="svrl:successful-report">
      <xsl:call-template name="string-replace-all">
         <xsl:with-param name="text">
            <xsl:call-template name="string-replace-all">
               <xsl:with-param name="text" select="@location"/>
               <xsl:with-param name="replace" select="&quot;*[local-name()='&quot;"/>
               <xsl:with-param name="by" select="''"/>
            </xsl:call-template>
         </xsl:with-param>
         <xsl:with-param name="replace" select="&quot;']&quot;"/>
         <xsl:with-param name="by" select="''"/>
      </xsl:call-template>
   </xsl:template>

   <xsl:template name="string-replace-all">
      <xsl:param name="text"/>
      <xsl:param name="replace"/>
      <xsl:param name="by"/>
      <xsl:choose>
         <xsl:when test="contains($text, $replace)">
            <xsl:value-of select="substring-before($text,$replace)"/>
            <xsl:value-of select="$by"/>
            <xsl:call-template name="string-replace-all">
               <xsl:with-param name="text" select="substring-after($text,$replace)"/>
               <xsl:with-param name="replace" select="$replace"/>
               <xsl:with-param name="by" select="$by"/>
            </xsl:call-template>
         </xsl:when>
         <xsl:otherwise>
            <xsl:value-of select="$text"/>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>
</xsl:stylesheet>

以下のXMLに当てはめると

<test xmlns:svrl="my:my">
   <svrl:successful-report test="." location="/*[local-name()='ClinicalDocument']/*[local-name()='component']/*[local-name()='structuredBody']/*[local-name()='component'][1]/*[local-name()='section']"/>
</test>

以下が出力されます

/ClinicalDocument/component/structuredBody/component[1]/section
于 2012-04-28T08:04:53.810 に答える