0

私はXSLTに不慣れであり、XML変換ソリューションに使用しているfor-each-groupループの奇妙なバグを突き止めるのを手伝う必要があります。XSLTは次のとおりです。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="trans-unit/target[mrk[following-sibling::text()]]">
    <xsl:copy>
      <xsl:copy-of select="./@*"/>
      <xsl:for-each-group select="node()" group-starting-with="mrk">
        <mrk>
          <xsl:for-each select="current-group()">
            <xsl:choose>
              <xsl:when test="name() = 'mrk' and position() = 1">
                <xsl:copy-of select="./@*"/>
              </xsl:when>
              <xsl:when test="name() != 'mrk'">
                <xsl:copy>
                  <xsl:copy-of select="@* | node()"/>
                </xsl:copy> 
              </xsl:when>         
            </xsl:choose>
          </xsl:for-each>
        </mrk>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

mrk基本的な考え方は、親ノード内の空のノードの後に​​兄弟を移動してノード内にtarget戻すことmrkです。次の簡略化されたサンプル入力を使用します。

<body>
  <trans-unit id="3" phase-name="pretrans" restype="x-p">
      <source>You can add descriptive text notes to a call recording, if you have the appropriate privileges to do so. These notes are visible to all users who have access to the call recording. It is recommended that each user add their initials to the notes to avoid potential confusion.</source>
      <seg-source>
          <mrk mtype="seg" mid="1">You can add descriptive text notes to a call recording, if you have the appropriate privileges to do so.</mrk>
          <mrk mtype="seg" mid="2">These notes are visible to all users who have access to the call recording.</mrk>
          <mrk mtype="seg" mid="3">It is recommended that each user add their initials to the notes to avoid potential confusion.</mrk>
      </seg-source>
      <target state="final">
        <mrk mtype="seg" mid="1" /><ph ctype="" id="1">&lt;MadCap:variable name="zoom_userdocs_variables.var_product_name" xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" /&gt;</ph> позволяет находить телефонные взаимодействия, содержащие или не содержащие определенные фразы.
        <mrk mtype="seg" mid="2" />Каждая речевая метка содержит одну или несколько таких фраз.
        <mrk mtype="seg" mid="3" />Ядро <ph ctype="" id="3">&lt;MadCap:variable name="zoom_userdocs_variables.var_product_name" xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" /&gt;</ph> индексирует медиафайлы и помечает места вхождения фразы (добавляет к ним метки).
        <mrk mtype="seg" mid="4" />Затем нужные медиафайлы можно искать по связанным с ними меткам.
      </target>
  </trans-unit>
</body>

私はこの出力を取得します:

<body>
  <trans-unit id="3" phase-name="pretrans" restype="x-p">
      <source>You can add descriptive text notes to a call recording, if you have the appropriate privileges to do so. These notes are visible to all users who have access to the call recording. It is recommended that each user add their initials to the notes to avoid potential confusion.</source>
      <seg-source>
          <mrk mtype="seg" mid="1">You can add descriptive text notes to a call recording, if you have the appropriate privileges to do so.</mrk>
          <mrk mtype="seg" mid="2">These notes are visible to all users who have access to the call recording.</mrk>
          <mrk mtype="seg" mid="3">It is recommended that each user add their initials to the notes to avoid potential confusion.</mrk>
      </seg-source>
      <target state="final">
       <mrk>
        </mrk>
       <mrk mtype="seg" mid="1">
          <ph ctype="" id="1">&lt;MadCap:variable name="zoom_userdocs_variables.var_product_name" xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" /&gt;</ph> позволяет находить телефонные взаимодействия, содержащие или не содержащие определенные фразы.
        </mrk>
       <mrk mtype="seg" mid="2">Каждая речевая метка содержит одну или несколько таких фраз.
        </mrk>
       <mrk mtype="seg" mid="3">Ядро <ph ctype="" id="3">&lt;MadCap:variable name="zoom_userdocs_variables.var_product_name" xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" /&gt;</ph> индексирует медиафайлы и помечает места вхождения фразы (добавляет к ним метки).
        </mrk>
       <mrk mtype="seg" mid="4">Затем нужные медиафайлы можно искать по связанным с ними меткам.
      </mrk>
    </target>
  </trans-unit>
</body>

期待される出力は次のとおりです。

<body>
  <trans-unit id="3" phase-name="pretrans" restype="x-p">
      <source>You can add descriptive text notes to a call recording, if you have the appropriate privileges to do so. These notes are visible to all users who have access to the call recording. It is recommended that each user add their initials to the notes to avoid potential confusion.</source>
      <seg-source>
          <mrk mtype="seg" mid="1">You can add descriptive text notes to a call recording, if you have the appropriate privileges to do so.</mrk>
          <mrk mtype="seg" mid="2">These notes are visible to all users who have access to the call recording.</mrk>
          <mrk mtype="seg" mid="3">It is recommended that each user add their initials to the notes to avoid potential confusion.</mrk>
      </seg-source>
      <target state="final">
          <mrk mtype="seg" mid="1"><ph ctype="" id="1">&lt;MadCap:variable name="zoom_userdocs_variables.var_product_name" xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" /&gt;</ph> позволяет находить телефонные взаимодействия, содержащие или не содержащие определенные фразы.</mrk>
          <mrk mtype="seg" mid="2">Каждая речевая метка содержит одну или несколько таких фраз.</mrk>
          <mrk mtype="seg" mid="3">Ядро <ph ctype="" id="3">&lt;MadCap:variable name="zoom_userdocs_variables.var_product_name" xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" /&gt;</ph> индексирует медиафайлы и помечает места вхождения фразы (добавляет к ним метки).</mrk>
          <mrk mtype="seg" mid="4">Затем нужные медиафайлы можно искать по связанным с ними меткам.</mrk>
      </target>
  </trans-unit>
</body>

mrkノード内の偽の最初の空の子ノードを取り除くにはどうすればよいtargetですか?for-each-group selectを「*」に変更しようとしましたが、テキストノードが失われます。これを完全に達成するためのより良い方法があれば、私はすべての耳です!:-)

4

1 に答える 1

2

これは、 node()でのグループ化が、ターゲット要素の最初のmrk要素の前の空白を取得しているためだと思います。

この場合、XSLTプロセッサにそのようなスペースを取り除くように指示できます。XSLTの先頭に次の行を追加してみてください( xsl:outputが実行した直後:

<xsl:strip-space elements="target" />

または、すべての要素に対して実行する場合は、これを実行します

<xsl:strip-space elements="*" />

これを行うと、次の出力が生成されます

<body>
   <trans-unit id="3" phase-name="pretrans" restype="x-p">
      <source>You can add descriptive text notes to a call recording, if you have the appropriate privileges to do so. These notes are visible to all users who have access to the call recording. It is recommended that each user add their initials to the notes to avoid potential confusion.</source>
      <seg-source>
         <mrk mid="1" mtype="seg">You can add descriptive text notes to a call recording, if you have the appropriate privileges to do so.</mrk>
         <mrk mid="2" mtype="seg">These notes are visible to all users who have access to the call recording.</mrk>
         <mrk mid="3" mtype="seg">It is recommended that each user add their initials to the notes to avoid potential confusion.</mrk>
      </seg-source>
      <target state="final">
         <mrk mid="1" mtype="seg">
            <ph ctype="" id="1">&lt;MadCap:variable name="zoom_userdocs_variables.var_product_name" xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" /&gt;</ph> ������������������ ���������������� �������������������� ����������������������������, �������������������� ������ ���� �������������������� ������������������������ ����������.
        </mrk>
         <mrk mid="2" mtype="seg">������������ �������������� ���������� ���������������� �������� ������ ������������������ ���������� ��������.
        </mrk>
         <mrk mid="3" mtype="seg">�������� <ph ctype="" id="3">&lt;MadCap:variable name="zoom_userdocs_variables.var_product_name" xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" /&gt;</ph> ���������������������� �������������������� �� ���������������� ���������� ������������������ ���������� (������������������ �� ������ ����������).
        </mrk>
         <mrk mid="4" mtype="seg">���������� ������������ �������������������� ���������� ������������ ���� ������������������ �� �������� ������������.
      </mrk>
      </target>
   </trans-unit>
</body>

(申し訳ありませんが、私のXSLTプロセッサは現在派手なテキスト文字を失っています!)

余談ですが、問題は発生していませんが、実際には次のステートメントを簡略化できます。

 <xsl:when test="name() = 'mrk' and position() = 1">

mrk要素からグループ化するため、位置1のmrk要素のみを取得するため、これを実行できます。

 <xsl:when test="name() = 'mrk'>

(これは、他のxsl:whenがxsl:otherwiseになる可能性があることも意味します)

于 2013-01-22T11:21:18.390 に答える