使用XSL处理XML

时间:2010-08-30 10:18:30

标签: xml xslt

我有一个由两部分组成的问题......

我有一些看起来像这样的XML:

<trans-unit id="70" restype="x-text:p">
<source xml:lang="en-en">option 4</source>
<target xml:lang="fr-fr">option 4</target>
</trans-unit>

<trans-unit id="71" restype="x-text:p">
<source xml:lang="en-en">option 5</source>
<target xml:lang="fr-fr">option 5</target>
</trans-unit>

<trans-unit id="72" restype="x-text:p">
<source xml:lang="en-en">option 6</source>
<target xml:lang="fr-fr">option 6</target>
</trans-unit>

现在,如果我只想显示,说目标(忽略源),这对XSL来说是一个完美的工作吗?我只是写了模板,我很好吗?

<trans-unit id="70" restype="x-text:p">
<target xml:lang="fr-fr">option 4</target>
</trans-unit>

<trans-unit id="71" restype="x-text:p">
<target xml:lang="fr-fr">option 5</target>
</trans-unit>

<trans-unit id="72" restype="x-text:p">
<target xml:lang="fr-fr">option 6</target>
</trans-unit>

如果我想添加这样的样式:

<trans-unit id="72" restype="x-text:p">
<target xml:lang="fr-fr"><span class="myclass>option 6</span></target>
</trans-unit>

XSL再次成为可能吗?

更新: 源XML

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="my.xsl"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"><file original="sample-document.odt/content.xml" source-language="en-en" target-language="fr-fr" datatype="x-undefined" xmlns:x="http://net.sf.okapi/ns/xliff-extensions" x:inputEncoding="UTF-8" x:configId="">
<body>
<trans-unit id="1" restype="x-text:p">
<source xml:lang="en-en">ENGA collection of ideas about Word Processing (also a test document for Docvert)</source>
<target xml:lang="fr-fr">FRAA collection of ideas about Word Processing (also a test document for Docvert)</target>
</trans-unit>
<trans-unit id="3" restype="x-text:h">
<source xml:lang="en-en">We Can Put an End to Word Attachments</source>
<target xml:lang="fr-fr">We Can Put an End to Word Attachments</target>
</trans-unit>
<trans-unit id="5" restype="x-text:p">
<source xml:lang="en-en"><g id="1"><g id="2"></g></g>Don't you just hate receiving Word documents in email messages? Word attachments are annoying, but worse than that, they impede people from switching to free software. Maybe we can stop this practice with a simple collective effort. All we have to do is ask each person who sends us a Word file to reconsider that way of doing things.</source>
<target xml:lang="fr-fr"><g id="1"><g id="2"></g></g>Don't you just hate receiving Word documents in email messages? Word attachments are annoying, but worse than that, they impede people from switching to free software. Maybe we can stop this practice with a simple collective effort. All we have to do is ask each person who sends us a Word file to reconsider that way of doing things.</target>
</trans-unit>
</body>
</file>
</xliff>

2 个答案:

答案 0 :(得分:1)

XSL是一种将一种XML方言转换为另一种XML语言的语言。

部分原因是选择要用作源的节点并决定输出 - 不同的元素,属性等。

因此,就这两个要求而言,XSL 可能是您的正确选择。

但是,您可能会发现使用XML解析器,迭代节点并直接添加详细信息可能对您有所帮助。

从你给出的简单例子中很难说,因为这两种方法都可以正常工作。如果你需要批发转型,XSL肯定是要走的路。

答案 1 :(得分:1)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="source"/>
    <xsl:template match="target/text()[.='option 6']">
        <span class="myclass">
            <xsl:value-of select="."/>
        </span>
    </xsl:template>
</xsl:stylesheet>

使用此输入:

<root>
    <trans-unit id="70" restype="x-text:p">
        <source xml:lang="en-en">option 4</source>
        <target xml:lang="fr-fr">option 4</target>
    </trans-unit>
    <trans-unit id="71" restype="x-text:p">
        <source xml:lang="en-en">option 5</source>
        <target xml:lang="fr-fr">option 5</target>
    </trans-unit>
    <trans-unit id="72" restype="x-text:p">
        <source xml:lang="en-en">option 6</source>
        <target xml:lang="fr-fr">option 6</target>
    </trans-unit>
</root>

输出:

<root>
    <trans-unit id="70" restype="x-text:p">
        <target xml:lang="fr-fr">option 4</target>
    </trans-unit>
    <trans-unit id="71" restype="x-text:p">
        <target xml:lang="fr-fr">option 5</target>
    </trans-unit>
    <trans-unit id="72" restype="x-text:p">
        <target xml:lang="fr-fr">
            <span class="myclass">option 6</span>
        </target>
    </trans-unit>
</root>