XSLT - 在一个节点中填充另一个节点中的缺失值,类似于此节点

时间:2017-04-26 17:54:25

标签: xml xslt xslt-1.0 xslt-2.0

我有这个:

<?xml version="1.0" encoding="UTF-8"?>
<xliffversion xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
  <file original="Target1/Localizable.strings" source-language="de" datatype="plaintext" target-language="en">
    <header>
      <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="8.2.1" build-num="8C1002"/>
    </header>
    <body>
      <trans-unit id="Die Stadt muss mindestens 2 Buchstaben aufweisen. Die Zeichen ' und - sind erlaubt.">
        <source>Die Stadt muss mindestens 2 Buchstaben aufweisen. Die Zeichen ' und - sind erlaubt.</source>
        <note>Humanized-Error: Validation of city</note>
      </trans-unit>
      <trans-unit id="Die Standorte konnten nicht geladen werden.">
        <source>Die Standorte konnten nicht geladen werden.</source>
        <note>Humanized-Error: MerchantMapServiceClient</note>
      </trans-unit>
      <trans-unit id="Die Straße muss angegeben werden.">
        <source>Die Straße muss angegeben werden.</source>
        <note>Humanized-Error: Validation of street</note>
      </trans-unit>
    </body>
  </file>
  <file original="Target2/Localizable.strings" source-language="de" datatype="plaintext" target-language="en">
    <header>
      <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="8.2.1" build-num="8C1002"/>
    </header>
    <body>
      <trans-unit id="Die Stadt muss mindestens 2 Buchstaben aufweisen. Die Zeichen ' und - sind erlaubt.">
        <source>Die Stadt muss mindestens 2 Buchstaben aufweisen. Die Zeichen ' und - sind erlaubt.</source>
        <target>City must contain at least 2 letters. Characters like ' and - are allowed.</target>
        <note>Humanized-Error: Validation of city</note>
      </trans-unit>
      <trans-unit id="Die Straße muss angegeben werden.">
        <source>Die Straße muss angegeben werden.</source>
        <target>Street is a mandatory field.</target>
        <note>Humanized-Error: Validation of street</note>
      </trans-unit>
    </body>
  </file>
  <file original="Target3/Localizable.strings" source-language="de" datatype="plaintext" target-language="en">
    <header>
      <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="8.2.1" build-num="8C1002"/>
    </header>
    <body>
      <trans-unit id="%@ - %@">
        <source>%1$@ - %2$@</source>
        <note>Transaktionen, Wochendatumsbereich, 2 parameter</note>
      </trans-unit>
      <trans-unit id="Die Standorte konnten nicht geladen werden.">
        <source>Die Standorte konnten nicht geladen werden.</source>
        <target>Could not load locations.</target>
        <note>Humanized-Error: MerchantMapServiceClient</note>
      </trans-unit>
      <trans-unit id="%ix einlösebereit!">
        <source>%ix einlösebereit!</source>
        <note>BonusProgramDetailView: points left info label shows how many times you can redeem your bonus</note>
      </trans-unit>
      <trans-unit id="Die Straße muss angegeben werden.">
        <source>Die Straße muss angegeben werden.</source>
        <target>Street is a mandatory field.</target>
        <note>Humanized-Error: Validation of street</note>
      </trans-unit>
    </body>
  </file>
</xliffversion>

我想要这个:

<?xml version="1.0" encoding="UTF-8"?>
<xliffversion xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
  <file original="Target1/Localizable.strings" source-language="de" datatype="plaintext" target-language="en">
    <header>
      <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="8.2.1" build-num="8C1002"/>
    </header>
    <body>
      <trans-unit id="Die Stadt muss mindestens 2 Buchstaben aufweisen. Die Zeichen ' und - sind erlaubt.">
        <source>Die Stadt muss mindestens 2 Buchstaben aufweisen. Die Zeichen ' und - sind erlaubt.</source>
        <target>City must contain at least 2 letters. Characters like ' and - are allowed.</target>
        <note>Humanized-Error: Validation of city</note>
      </trans-unit>
      <trans-unit id="Die Standorte konnten nicht geladen werden.">
        <source>Die Standorte konnten nicht geladen werden.</source>
        <target>Could not load locations.</target>
        <note>Humanized-Error: MerchantMapServiceClient</note>
      </trans-unit>
      <trans-unit id="Die Straße muss angegeben werden.">
        <source>Die Straße muss angegeben werden.</source>
        <target>Street is a mandatory field.</target>
        <note>Humanized-Error: Validation of street</note>
      </trans-unit>
    </body>
  </file>
  <file original="Target2/Localizable.strings" source-language="de" datatype="plaintext" target-language="en">
    <header>
      <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="8.2.1" build-num="8C1002"/>
    </header>
    <body>
      <trans-unit id="Die Stadt muss mindestens 2 Buchstaben aufweisen. Die Zeichen ' und - sind erlaubt.">
        <source>Die Stadt muss mindestens 2 Buchstaben aufweisen. Die Zeichen ' und - sind erlaubt.</source>
        <target>City must contain at least 2 letters. Characters like ' and - are allowed.</target>
        <note>Humanized-Error: Validation of city</note>
      </trans-unit>
      <trans-unit id="Die Straße muss angegeben werden.">
        <source>Die Straße muss angegeben werden.</source>
        <target>Street is a mandatory field.</target>
        <note>Humanized-Error: Validation of street</note>
      </trans-unit>
    </body>
  </file>
  <file original="Target3/Localizable.strings" source-language="de" datatype="plaintext" target-language="en">
    <header>
      <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="8.2.1" build-num="8C1002"/>
    </header>
    <body>
      <trans-unit id="%@ - %@">
        <source>%1$@ - %2$@</source>
        <note>Transaktionen, Wochendatumsbereich, 2 parameter</note>
      </trans-unit>
      <trans-unit id="Die Standorte konnten nicht geladen werden.">
        <source>Die Standorte konnten nicht geladen werden.</source>
        <target>Could not load locations.</target>
        <note>Humanized-Error: MerchantMapServiceClient</note>
      </trans-unit>
      <trans-unit id="%ix einlösebereit!">
        <source>%ix einlösebereit!</source>
        <note>BonusProgramDetailView: points left info label shows how many times you can redeem your bonus</note>
      </trans-unit>
    </body>
  </file>
</xliffversion>

xsl转换需要执行以下操作: 遍历所有trans-unit个节点,并检查它们是否包含<target>节点。如果是这样,那就没事了。如果没有,那么它应该寻找另一个trans-unit节点(具有相同的id,但在不同的<file>节点内)并将<target>节点(如果有的话)复制到节点中它失踪的地方。我如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

这可能对您有用:

  <xsl:key name="myKey" match="trans-unit[target]" use="@id"/>


  <xsl:template match="trans-unit[not(target)]">
    <xsl:variable name="id" select="@id"/>
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="source"/>
      <!-- If there is more than one match, pick the first one. -->
      <xsl:apply-templates select="key('myKey', $id)[1]/target"/>
      <xsl:apply-templates select="note"/>
    </xsl:copy>
  </xsl:template>


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