2016-07-29 3 views
0

내 프로젝트 중 하나에는 GUI 용 플롯을 생성해야하는 템플릿이 포함 된 XML 파일이 있습니다. 사용자는 자체 XML 템플리트를 작성하여 현재로드 데이터에 적용 할 수 있습니다. XSLT를 사용한 데이터 기반 XML 생성

<?xml version="1.0" encoding="utf-8"?> 
<Templates> 
    <Template name="template"> 
    <PlotWindow name="PlotWindow"> 
     <Title>My title</Title> 
     <For> 
     <Var>%Variable%</Var> 
     <Plot name="%Variable%"> 
      <Item>f(%Variable%)</Item> 
     </Plot> 
     </For> 
    </PlotWindow> 
    </Template> 
</Templates> 

For -tag

%Variable%에 포함 된 모든 데이터로 대체해야합니다

단순화 된 XML 템플릿 파일은 다음과 같이 보인다. 데이터 자체는 두 번째 XML 파일에 정의됩니다.

<?xml version="1.0" encoding="utf-8"?> 
<Data> 
    <Var name="%Variable%"> 
    <Item>Test</Item> 
    <Item>MyVar</Item> 
    <Item>ABC</Item> 
    </Var> 
</Data> 

%Variable%Test, MyVarABC 통해 반복한다. 원하는 출력은 다음과 같은 세 번째 XML 파일이어야합니다.

<?xml version="1.0" encoding="utf-8"?> 
<Result> 
    <PlotWindow name="PlotWindow"> 
    <Title>My title</Title> 
    <Plot name="Test"> 
     <Item>f(Test)</Item> 
    </Plot> 
    <Plot name="MyVar"> 
     <Item>f(MyVar)</Item> 
    </Plot> 
    <Plot name="ABC"> 
     <Item>f(ABC)</Item> 
    </Plot> 
    </PlotWindow> 
</Result> 

일종의 XSLT 파일로 이러한 결과를 얻을 수 있어야합니다.

이 파일의 모습은 무엇입니까?

+0

당신이 알고있는대로 주제는 주제에 가깝습니다. 아무도 당신을 위해 "xslt가 어떻게 생겼는지"보여 줄 수는 없지만 xhl은 IMhO에서 가능해야합니다. –

+0

이 조언을 해주셔서 감사합니다. 내 질문의 마지막 부분을 삭제했습니다. – Aleph0

답변

1

나는 당신의 예 (Data에 여러 Var 요소? PlotWindow의 여러 For 요소가있을 수 있습니까?) 얼마나 자세한 확실하지만,이 해결책이 될 수있는 현재의 콘텐츠를 제공 아니에요. XML을 가정

보이는 같은 :

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <Data> 
     <Var name="%Variable%"> 
      <Item>Test</Item> 
      <Item>MyVar</Item> 
      <Item>ABC</Item> 
     </Var> 
    </Data> 
    <Templates> 
     <Template name="template"> 
      <PlotWindow name="PlotWindow"> 
       <Title>My title</Title> 
       <For> 
        <Var>%Variable%</Var> 
        <Plot name="%Variable%"> 
         <Item>f(%Variable%)</Item> 
        </Plot> 
       </For> 
      </PlotWindow> 
     </Template> 
    </Templates> 
</root> 

(나는 Data가 다른 파일에 생각 때문에, 라인 <xsl:for-each select="//Data">에로드 할 document() 기능을 사용하는 경우..)

XSL :

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

    <xsl:template match="Templates"> 
     <Result> 
      <xsl:apply-templates/> 
     </Result> 
    </xsl:template> 

    <xsl:template match="PlotWindow|Title"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="For"> 
     <xsl:variable name="name" select="./Var/text()"/> 

     <xsl:for-each select="//Data"> 
       <xsl:for-each select="Var[@name=$name]"> 
        <xsl:for-each select="Item"> 
         <xsl:variable name="plotname" select="./text()"/> 
         <Plot name="{$plotname}"> 
          <Item>f(<xsl:value-of select="$plotname"/>)</Item> 
         </Plot> 
        </xsl:for-each> 
       </xsl:for-each> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="Data|Var|Item"></xsl:template> 

</xsl:stylesheet> 

결과 :

<?xml version="1.0" encoding="UTF-8"?> 
<Result> 
    <PlotWindow name="PlotWindow"> 
     <Title>My title</Title> 
     <Plot name="Test"> 
      <Item>f(Test)</Item> 
     </Plot> 
     <Plot name="MyVar"> 
      <Item>f(MyVar)</Item> 
     </Plot> 
     <Plot name="ABC"> 
      <Item>f(ABC)</Item> 
     </Plot> 
    </PlotWindow> 
</Result> 
관련 문제