1

「a」タグの属性を取得して処理する必要があります。

ソース:

<Data>
    <AAA>
    <strong xmlns="http://www.w3.org/1999/xhtml">some Text
     <a href="#" name="Value1,Value2,Value3,Value4,Value5,Value6" id="Functionaldata" xmlns="http://www.w3.org/1999/xhtml">Value6</a>
    </strong>
    hello
    <a title="google" href="http://google.com" xmlns="http://www.w3.org/1999/xhtml">Hey</a> all <a href="#" name="element1,element2,element3,element4,element5,element6" id="Functionaldata" xmlns="http://www.w3.org/1999/xhtml">element6</a>
    <AAA>
</Data>

出力

<Content>
  <Information>
    <text>
        <strong xmlns="http://www.w3.org/1999/xhtml">some Text
        <dynamicinfo type="Value1" name="Value2" group="Value3" id="Value4" link="Value5" display="Value6"/>
    </strong>
    hello<a title="google" href="http://google.com">Hey</a> all 
    <dynamicinfo type="element1" name="element2" group="element3" id="element4" link="element5" display="element6"/>
    </text>
  </Information>
 </Content>

id=Functionaldata の「a」タグの処理に感銘を受けました。

それについての彼らの見解を助けることができますか。

ありがとうございました。

4

2 に答える 2

1

この変換:

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

     <my:names>
      <n>type</n>
      <n>name</n>
      <n>group</n>
      <n>id</n>
      <n>link</n>
      <n>display</n>
     </my:names>

     <xsl:variable name="vNames" select="document('')/*/my:names/*"/>

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

         <xsl:template match="a[@name] | x:a[@name]">
          <xsl:copy>
           <xsl:apply-templates select="@*[not(name()='name')]"/>
           <xsl:apply-templates select="@name"/>
          </xsl:copy>
         </xsl:template>

     <xsl:template match="a/@name | x:a/@name" name="split">
      <xsl:param name="pText" select="."/>
      <xsl:param name="pOrd" select="1"/>

      <xsl:if test="$pText">
        <xsl:attribute name="{$vNames[position()=$pOrd]}">
          <xsl:value-of select=
            "substring-before(concat($pText, ','), ',')"/>
        </xsl:attribute>

        <xsl:call-template name="split">
          <xsl:with-param name="pText" select="substring-after($pText, ',')"/>
          <xsl:with-param name="pOrd" select="$pOrd+1"/>
        </xsl:call-template>
      </xsl:if>
     </xsl:template>
</xsl:stylesheet>

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

<Data>
        <AAA>
        <strong xmlns="http://www.w3.org/1999/xhtml">some Text
         <a href="#" name="Value1,Value2,Value3,Value4,Value5,Value6" id="Functionaldata">Value6</a>
        </strong>
        hello
        <a title="google" href="http://google.com">Hey</a> all
        <a href="#" name="element1,element2,element3,element4,element5,element6" id="Functionaldata">element6</a>
        </AAA>
</Data>

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

<Data>
   <AAA>
      <strong xmlns="http://www.w3.org/1999/xhtml">some Text
         <a href="#" id="Value4" type="Value1" name="Value2" group="Value3" link="Value5" display="Value6"/>
      </strong>
        hello
        <a title="google" href="http://google.com">Hey</a> all
        <a href="#" id="element4" type="element1" name="element2" group="element3" link="element5" display="element6"/>
   </AAA>
</Data>

説明:

これは、以前の質問の解決策に基づいて構築されており、次の変更が加えられています。

  1. ID ルールの使用とオーバーライド。

  2. 要素の代わりに、分割の結果を値として持つ属性が作成されます。

  3. 生成される属性の名前は、グローバルmy:names要素の子として指定されます。

更新

コメントで、OP は彼の質問を次のように修正しました。

「a」タグの名前空間を追加するのを忘れていました。すべての「a」タグには「xhtml」名前空間があります。

答えは、この場合、提供された変換は問題なく機能し、変更する必要がないということです。

ただし、次のように簡略化できます。

置換:

<xsl:template match="a[@name] | x:a[@name]">

だけで

<xsl:template match="x:a[@name]">

と置き換えます:

<xsl:template match="a/@name | x:a/@name" name="split">

だけで

<xsl:template match="x:a/@name" name="split">

これらの変更後の完全な変換は次のようになります。

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

     <my:names>
      <n>type</n>
      <n>name</n>
      <n>group</n>
      <n>id</n>
      <n>link</n>
      <n>display</n>
     </my:names>

     <xsl:variable name="vNames" select="document('')/*/my:names/*"/>

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

         <xsl:template match="x:a[@name]">
          <xsl:copy>
           <xsl:apply-templates select="@*[not(name()='name')]"/>
           <xsl:apply-templates select="@name"/>
          </xsl:copy>
         </xsl:template>

     <xsl:template match="x:a/@name" name="split">
      <xsl:param name="pText" select="."/>
      <xsl:param name="pOrd" select="1"/>

      <xsl:if test="$pText">
        <xsl:attribute name="{$vNames[position()=$pOrd]}">
          <xsl:value-of select=
            "substring-before(concat($pText, ','), ',')"/>
        </xsl:attribute>

        <xsl:call-template name="split">
          <xsl:with-param name="pText" select="substring-after($pText, ',')"/>
          <xsl:with-param name="pOrd" select="$pOrd+1"/>
        </xsl:call-template>
      </xsl:if>
     </xsl:template>
</xsl:stylesheet>
于 2012-06-27T12:25:05.120 に答える
0

EXSLT にアクセスできる場合は、str:split()メソッドを使用してこれを実現できます。

より大きな問題は、値を、指定した新しい属性名にどのようにマッピングしているのかということです。これは、値の名前を前もって宣言し、値の名前 1 を分割値 1 に、値の名前 2 を分割値 2 に、というようにマップします。

<!-- node-set of value names, which will each correspond to the value at the same index, once they're split -->
<xsl:variable name='value_names' select='str:split("type|name|group|id|link|display", "|")' />

<!-- match root -->
<xsl:template match="/">
    <dynamicdata>
        <xsl:apply-templates name='values' select='str:split(root/a/@name, ",")' />
    </dynamicdata>
</xsl:template>

<!-- iteration content - each value from the split -->
<xsl:template match='token'>
    <xsl:variable name='pos' select='position()' />
    <xsl:attribute name='{$value_names[$pos]}'><xsl:value-of select='.' /></xsl:attribute>
</xsl:template>

これは、この XMLPlayground セッションで動作を確認できます(出力ソースを参照)。

于 2012-06-27T11:39:32.797 に答える