簡體   English   中英

XSLT-將子節點合並為一個

[英]XSLT - merge sub nodes into one

我有這個輸入:

<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file original="TargetInteresting1/Localizable.strings" >
        <header>
            <tool tool-id="com.apple.dt.xcode"/>
        </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>
            </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>
            </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>
            </trans-unit>
            <trans-unit id="%ix einlösebereit!">
                <source>%ix einlösebereit!</source>
                <target>%ix ready to redeem</target>
            </trans-unit>
        </body>
    </file>
    <file original="TargetInteresting2/Localizable.strings">
        <header>
            <tool tool-id="com.apple.dt.xcode"/>
        </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>
            </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>
            </trans-unit>
        </body>
    </file>
    <file original="TargetInteresting3/Localizable.strings">
        <header>
            <tool tool-id="com.apple.dt.xcode"/>
        </header>
        <body>
            <trans-unit id="%@ - %@">
                <source>%1$@ - %2$@</source>
                <target>%1$@ - %2$@</target>
            </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>
            </trans-unit>
            <trans-unit id="%ix einlösebereit!">
                <source>%ix einlösebereit!</source>
                <target>%ix ready to redeem</target>
            </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>
            </trans-unit>
        </body>
    </file>
    <file original="TargetNotInteresting1/Localizable.strings">
        <header>
            <tool tool-id="com.apple.dt.xcode"/>
        </header>
        <body>
            <trans-unit id="%@ - %@">
                <source>%1$@ - %2$@</source>
                <target>%1$@ - %2$@</target>
            </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>
            </trans-unit>
        </body>
    </file>
</xliff>

我需要以下輸出:

<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file original="TargetMerged/Localizable.strings">
        <header>
            <tool tool-id="com.apple.dt.xcode"/>
        </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>
            </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>
            </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>
            </trans-unit>
            <trans-unit id="%ix einlösebereit!">
                <source>%ix einlösebereit!</source>
                <target>%ix ready to redeem</target>
            </trans-unit>
            <trans-unit id="%@ - %@">
                <source>%1$@ - %2$@</source>
                <target>%1$@ - %2$@</target>
            </trans-unit>
        </body>
    </file>
    <file original="TargetNotInteresting1/Localizable.strings">
        <header>
            <tool tool-id="com.apple.dt.xcode"/>
        </header>
        <body>
            <trans-unit id="%@ - %@">
                <source>%1$@ - %2$@</source>
                <target>%1$@ - %2$@</target>
            </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>
            </trans-unit>
            <trans-unit id="%ix einlösebereit!">
                <source>%ix einlösebereit!</source>
                <target>%ix ready to redeem</target>
            </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>
            </trans-unit>
        </body>
    </file>
    <file original="TargetNotInteresting2/Localizable.strings">
        <header>
            <tool tool-id="com.apple.dt.xcode"/>
        </header>
        <body>
            <trans-unit id="%@ - %@">
                <source>%1$@ - %2$@</source>
                <target>%1$@ - %2$@</target>
            </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>
            </trans-unit>
            <trans-unit id="%ix einlösebereit!">
                <source>%ix einlösebereit!</source>
                <target>%ix ready to redeem</target>
            </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>
            </trans-unit>
        </body>
    </file>
</xliff>

它需要執行以下操作:

創建一個新的<file>節點: <file original="TargetMerged/Localizable.strings"...>並將所有<trans-unit>節點從<file original = "TargetInteresting1/Localizable.strings"<file original = "TargetInteresting2/Localizable.strings"<file original = "TargetInteresting3/Localizable.strings"到合並的節點中(如果尚未存在,我想可以使用<trans-unit>id屬性進行檢查)。

沒有3個original屬性值(TargetInteresting1,TargetInteresting2,TargetInteresting3)中的任何一個的節點都應原樣復制到最終結果中。

我正在尋找xslt 2.0的解決方案。 我不知道從哪里開始,我真的不習慣xslt :-(

考慮下面的最小化示例:

XML格式

<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file original="TargetInteresting1/Localizable.strings">
        <trans-unit>1</trans-unit>
        <trans-unit>2</trans-unit>
    </file> 
    <file original="TargetInteresting2/Localizable.strings">
        <trans-unit>3</trans-unit>
    </file> 
    <file original="TargetInteresting3/Localizable.strings">
        <trans-unit>4</trans-unit>
        <trans-unit>5</trans-unit>
        <trans-unit>6</trans-unit>
    </file> 
    <file original="TargetNotInteresting1/Localizable.strings">
        <trans-unit>7</trans-unit>
        <trans-unit>8</trans-unit>
    </file> 
    <file original="TargetNotInteresting2/Localizable.strings">
        <trans-unit>9</trans-unit>
        <trans-unit>10</trans-unit>
    </file> 
</xliff>

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="urn:oasis:names:tc:xliff:document:1.2"
xmlns="urn:oasis:names:tc:xliff:document:1.2">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/xliff">
    <xsl:copy>
        <xsl:variable name="regex">TargetInteresting[1-3]/Localizable.strings</xsl:variable>
        <file original="TargetMerged/Localizable.strings">
            <xsl:copy-of select="file[matches(@original,$regex)]/trans-unit"/>
        </file>
        <xsl:copy-of select="file[not(matches(@original,$regex))]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

結果

<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2">
   <file original="TargetMerged/Localizable.strings">
      <trans-unit>1</trans-unit>
      <trans-unit>2</trans-unit>
      <trans-unit>3</trans-unit>
      <trans-unit>4</trans-unit>
      <trans-unit>5</trans-unit>
      <trans-unit>6</trans-unit>
   </file>
   <file original="TargetNotInteresting1/Localizable.strings">
      <trans-unit>7</trans-unit>
      <trans-unit>8</trans-unit>
   </file>
   <file original="TargetNotInteresting2/Localizable.strings">
      <trans-unit>9</trans-unit>
      <trans-unit>10</trans-unit>
   </file>
</xliff>

http://xsltransform.net/a9Giws

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM