InDesign:在多个字段中放置一个XML信息

时间:2015-07-29 10:20:36

标签: xml adobe adobe-indesign

我对InDesign和XML有一些疑问。

我有一个像这样的简单XML文件:

<product>
<name>...</name>
<price>...</price>
</product>

<currency>EUR</currency>

我已将其导入InDesign,到目前为止一切正常。我已将每个产品的price代码分配给文档中的相应文本字符,并在尝试分配currency代码时遇到一些问题:

我想将单个currency标记分配给多个文本字段,因为我想要在所有价格之后拥有相同的货币(在我的情况下:EUR)。但是InDesign不允许我这样做,如果我将标签分配给一个文本字段并继续将其标记为另一个文本字段,它会从我添加到的第一个文本字段中删除该标记。

我尝试过很好地复制文本字段,这似乎在XML侧边栏中创建了新的XML信息。到目前为止一切顺利,但是如果我现在对源文件中的XML信息进行更改,它会完全删除包含该信息的所有复制文本字段。

有关如何使这项工作的任何建议?我在谷歌上发现的只是将多个XML标签分配给一个文本字段,但这不是我正在搜索的内容。

谢谢!

3 个答案:

答案 0 :(得分:0)

这里有很多选项,但也取决于货币信息的动态性。如果您总是使用欧元,您可以使用脚本在价格标签的末尾添加欧元,也可以更改布局,以便&#34; EUR&#34; string是要重复的布局的一部分。或者XSLT动态更改XML结构,以便货币自动放置在正确的位置或重复。 你能给出更丰富的样本吗?

答案 1 :(得分:0)

鉴于您的输入xml结构是:

<?xml version="1.0" encoding="UTF-8"?>
<products>
    <product>
        <name>A</name>
        <price>10</price>
    </product>
    
    <product>
        <name>B</name>
        <price>20</price>
    </product>
    
    <currency>EUR</currency>
</products>

然后像xslt一样:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">
    <xsl:output method="xml"/>
    
    
    <xsl:template match="/">
        <xsl:variable name="curr">
            <xsl:value-of select="*/currency"></xsl:value-of>
        </xsl:variable>
        <products>
            <xsl:for-each select="*/product">
             <product>
                <xsl:copy-of select="name"/>
                <xsl:apply-templates select="price">
                    <xsl:with-param name="curr">
                        <xsl:value-of select="$curr"></xsl:value-of>
                    </xsl:with-param>
                </xsl:apply-templates>
                </product>
            </xsl:for-each>
            
        </products>
        
    </xsl:template>
    
    
    <xsl:template match="price">
        <xsl:param name="curr"></xsl:param>
        <price>
            <xsl:value-of select="."/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="$curr"></xsl:value-of>
        </price>
    </xsl:template>
</xsl:stylesheet>

会输出:

<?xml version="1.0" encoding="UTF-8"?>
<products>
    <product>
        <name>A</name>
        <price>10 EUR</price>
    </product>
    <product>
        <name>B</name>
        <price>20 EUR</price>
    </product>
</products>

答案 2 :(得分:0)

以下xsl将在价格节点之后的每个产品节点中添加货币节点:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">
    <xsl:output method="xml"/>

    <xsl:template match="@*|*|text()|processing-instruction()">
        <xsl:copy>
            <xsl:apply-templates select="@*|*|text()|processing-instruction()"/>
        </xsl:copy>
        <xsl:if test="local-name()='price'">
            <xsl:copy-of select="//currency[1]"/>    
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

InDesign提供了在导入xml时应用xsl的选项。

如果您希望将货币字符串附加到价格字符串的末尾,则可以使用:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">
    <xsl:output method="xml"/>

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

    <xsl:template match="price">
        <xsl:copy>
            <xsl:value-of select="concat(.,' ',//currency[1])"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>